ios學習系列四之控制器相關知識

更多相關文章:http://www.codefrom.com/p/iosios

本篇是第四二部分,關於控制器的一些內容。
1. 控制器加載相關過程ide

1.控制器加載atom


2.內存警告處理
spa

3.生命週期3d

** 2. 控制器建立**代理

控制器的建立方式:經過storyboard建立,直接建立,指定xib文件建立。
code

  • 直接建立:orm

    UIViewController *vc = [[UIViewController alloc] init];
  • 從xib建立對象

    UIViewController *vc = [[UIViewController alloc] initWithNibName:@」nibView" bundle:nil];
  • 從storyboard建立blog

    • 加載storyboard文件

      UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Test" bundle:nil];
    • 初始化
      // 初始化「初始控制器」(箭頭所指的控制器) UIViewController *vc = [storyboard instantiateInitialViewController]; // 經過一個標識初始化對應的控制器 UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@」vc"];

建立view的幾種狀況:

  • 沒有xib和storyboard是,會建立一個空白的view做爲控制器的view。
  • 經過storyboard建立時,會建立箭頭指向控制器的view做爲view。若是重寫了控制器的loadView方法,就不會建立storyboard中描述的view做爲控制器的view,而是建立一個空白的view做爲控制器的view。
  • 若是指定xib,會建立xib中描述的view做爲控制器的view。
  • 若是有同名的xib,會建立xib中描述的view做爲控制器的view。
  • 有同名的去掉Controller的xib,會自動找到該xib的view做爲控制器的view。
  • 若是重寫了控制器的loadView方法,就不會去加載建立同名去掉Controller的xib和同名的xib,而是建立一個空白的view做爲控制器的view。

3.導航控制器

1.UINavigationController以棧的形式保存子控制器

2.使用push方法能將某個控制器壓入棧

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;

使用pop方法能夠移除控制器

// 將棧頂的控制器移除
 - (UIViewController *)popViewControllerAnimated:(BOOL)animated;
 // 回到指定的子控制器
 - (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated;
 // 回到根控制器(棧底控制器)
 - (NSArray *)popToRootViewControllerAnimated:(BOOL)animated;

4.storyboard中鏈接界面負責跳轉的線,都是一個UIStoryboardSegue對象(簡稱Segue)。每個segue對象都有三個屬性:

// 惟一標識
 @property (nonatomic, readonly) NSString *identifier;
 // 來源控制器
 @property (nonatomic, readonly) id sourceViewController;
 // 目標控制器
 @property (nonatomic, readonly) id destinationViewController;

根據segue的執行時刻,能夠分爲兩大類型:1. 自動型:點擊某個控件以後,自動執行segue完成界面跳轉;2. 手動型:須要經過代碼手動執行segue才能完成跳轉。

在須要對跳轉進行判斷時調用- (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender方法,能夠根據傳入segue的標識符進行判斷,知足必定條件以後纔會進行跳轉。該方法的執行過程:

1. 根據identifier去storyboard中找到對應的線,新建UIStoryboardSegue對象
 2. 設置Segue對象的sourceViewController(來源控制器)
 3. 新建而且設置Segue對象的destinationViewController(目標控制器)

不一樣控制器之間數據傳遞,在控制器跳轉時系統會自動調用- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender,能夠在該方法中根據segue的標識符來判斷目的控制器從而完成跳轉。過程以下:

調用Segue對象的- (void)perform;方法開始執行界面跳轉操做
 取得sourceViewController所在的UINavigationController
 調用UINavigationController的push方法將destinationViewController壓入棧中,完成跳轉

5.不一樣控制器的數據傳遞

控制器之間的數據傳遞主要有兩種:順傳和逆傳。順傳指數據傳遞方向和控制器跳轉方向一致,逆傳是指數據傳遞方向和控制器跳轉方向相反。順傳能夠調用源控制器的prepareForSegue:sender:方法來傳遞數據;逆傳須要使用代理,控制器跳轉時,讓源控制器成爲目的控制器的代理,在目的控制器中調用源控制器的代理方法,經過代理方法的參數傳遞數據到源控制器。

6.經過modal來切換控制器

任何控制器均可以經過modal的形式展現出來,默認效果爲新控制器從屏幕的最底部往上鑽,直到蓋住以前的控制器爲止,須要注意的是,在modal出來的控制器中不能調用push方法切換控制器。方法:

// 以Modal的形式展現控制器
 - (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion;
 // 關閉當初Modal出來的控制器
 - (void)dismissViewControllerAnimated: (BOOL)flag completion: (void (^)(void))completion;
相關文章
相關標籤/搜索