【Xamarin 開發 IOS --IOS ViewController生命週期】

來源:互聯網
上載者:User

標籤:

ViewController

ViewController是IOS開發中MVC模式中的C,ViewController是view的controller,ViewController的職責主要包括管理內部各個view的載入顯示和卸載,同時負責與其他ViewController的通訊和協調。

在IOS中,有兩類ViewController,一類是顯示內容的,比如UIViewController、UITableViewController等,同時還可以自訂繼承自UIViewController的ViewController;另一類是ViewController容器,UINavigationViewController和UITabBarController等,UINavigationController是以Stack的形式來儲存和管理ViewController,UITabBarController是以Array的形式來管理ViewController。

 

View的載入

可以看到,在Controller中建立View有2種方法,一種是使用Storyboard等視覺化檢視,另一種是通過代碼建立。可視化建立在工程中很少用到,因為它滿足不了開發人員如饑似渴的需求--。

 

代碼建立介面檔案

1.建立新的Empty Application Project

2.建立ViewController的類,添加loadView方法,及viewDidLoad等方法

////  XYZViewController.m//  ViewLifeCycle////  Created by Norcy on 14-7-28.//  Copyright (c) 2014年 QQLive. All rights reserved.//#import "XYZViewController.h"@interface XYZViewController ()@end@implementation XYZViewController- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];    if (self) {        // Custom initialization    }    return self;}- (void)loadView{    UIView *contentView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];        contentView.backgroundColor = [UIColor blueColor];        self.view = contentView;}- (void)viewDidLoad{    [super viewDidLoad];    // Do any additional setup after loading the view.    NSLog(@"View Did Load");}- (void)viewWillAppear:(BOOL)animated{    NSLog(@"View Will Appear");}- (void)viewDidAppear:(BOOL)animated{    NSLog(@"View Did Appear");}- (void)viewWillDisappear:(BOOL)animated{    NSLog(@"View Will Disappear");}- (void)viewDidDisappear:(BOOL)animated{    NSLog(@"View Did Disappear");}@end
View Code

3.在AppDelegate.m中的application:didFinishLaunchingWithOptions:中註冊ViewController

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];    // Override point for customization after application launch.    self.window.backgroundColor = [UIColor whiteColor];    XYZViewController *viewController = [[XYZViewController alloc]initWithNibName:nil bundle:nil];    self.window.rootViewController = viewController;    [self.window makeKeyAndVisible];    return YES;}
View Code

 

雖然我們可以在AppDelegate.m中的application:didFinishLaunchingWithOptions:中設定window的代碼後面添加view,但是在一般的工程中,我們不會在委託類中管理我們的View。 而是利用委託類中的UIWindow去添加UIViewController,再在ViewController類中去管理View。

 

附,建立帶NavigationController的代碼

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];    self.window.backgroundColor = [UIColor whiteColor];    /*設定Navigation controller*/    XYZFirstViewController *viewController = [[XYZFirstViewController alloc] initWithNibName:nil bundle:nil];    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:viewController];    [nav setNavigationBarHidden:YES animated:NO];    self.window.rootViewController = nav;    [self.window makeKeyAndVisible];    [viewController release];    [nav release];    return YES;}
View Code

 

ViewController生命週期

alloc -> initWithNibName -> loadView -> viewDidLoad -> viewWillAppear -> viewDidAppear -> viewWillDisappear -> viewDidDisappear -> dealloc

注意viewWillUnload和viewDidUnload已經在ios6被廢棄了,因為Clearing references to views is no longer necessary。

注意1.沒有viewWillLoad。

注意2.viewDidLoad和viewDidUnload並不是成對的。

 

啟動程式

2014-07-28 17:43:36.124 ViewLifeCycle[4007:a0b] View Did Load
2014-07-28 17:43:36.125 ViewLifeCycle[4007:a0b] View Will Appear
2014-07-28 17:43:36.128 ViewLifeCycle[4007:a0b] View Did Appear

按下Home鍵,並沒有任何記錄

雙擊Home鍵,刪除該程式
2014-07-28 17:43:51.327 ViewLifeCycle[4007:a0b] View Will Disappear
2014-07-28 17:43:51.327 ViewLifeCycle[4007:a0b] View Did Disappear

 

為什麼按下Home鍵之後沒有調用viewWillDisappear和viewDidDisappear呢?

因為在ios4後引入了背景概念,當按下Home鍵之後,程式被掛起了,但是該View依然是原來的View,並不是新的。所以只有記憶體不夠的時候或程式被終止的時候,才會調用viewWillDisappear和viewDidDisappear。

 

View的卸載

 

loadView v.s. viewDidLoad

view的nib檔案為nil時,手工建立視圖介面時調用loadView;當view的nib檔案存在的時候,初始化工作在viewDidLoad中實現。

loadView時view還沒有產生,viewDidLoad時,view已經產生了。loadView方法用來建立一個新的view。loadView只會被調用一次,而viewDidLoad可能會被調用多次。

當受到記憶體警告時,那麼此時系統預設操作會檢查當前視圖控制器的view是否還在使用,如果沒在使用且控制器實現了loadView方法,ViewController會將view release並將其指向為nil。

 

注意,不要在loadView中調用父類方法[super loadView],因為這會影響CPU效能。

注意2,切換前後台不會調用viewWillAppear

參考文章

IOS學習筆記——ViewController生命週期詳解

IOS開發之介面生命週期(view lifecycle)

 

【Xamarin 開發 IOS --IOS ViewController生命週期】

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.