IOS的控制器

控制器簡單來講,就是用來作界面跳轉的,相似於 Android 的Intentios

 

1.建立一個控制器app

 1 控制器的常見的建立方式
 2 
 3 1)經過storyboard建立
 4 
 5 //直接建立
 6 NJViewController *nj = [[NJViewController alloc]init];
 7 
 8 //指定xib文件
 9 NJViewcontroller *nj = [[NJViewController alloc]
10 initWithNibName:@"NJViewController" bundle:nil];
11 
12 //先加載storyboard文件(Test是stroyboard的文件名)
13 UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Test" bundle:nil];
14 
15 接着初始化storyboard中的控制器
16 初始化"初始控制器"(箭頭所指的控制器)
17 NJViewController *nj = [storyboard instantiateInitialViewController];
18 
19 經過一個標識初始化對應的控制器
20 NJViewController *nj=[storyboard instantiateViewControllerWithIdentifier:@"nj"];

MJViewController的view的建立圖ide

控制器的加載atom

1 1.控制器的view是延遲加載的,用到時再加載
2 2.能夠用isViewLoaded方法判斷一個UIViewController的view是否已經被加載
3 3.控制器的view加載完畢就會調用viewDidLoad方法

多控制器spa

 1 1.一個ios的app不多隻由一個控制器組成,除非這個app極其簡單
 2 2.當app中有多個控制器的時候,咱們就須要對這些控制器進行管理
 3 3.有多個view時,能夠用一個大得view去管理1個或者多個小view
 4 4.控制器也是如此,用1個控制器去管理其餘多個控制器
 5  
 6 好比:
 7        用一個控制器A 去管理3個控制器B、C、D 控制器A被稱爲控制器B、C、D 的"父控制器",控制器 B、C、D  的被稱爲控制器A的子控制器
 8 
 9 爲了便於管理控制器,IOS提供了2個比較特殊的控制器
10 UINavigationController
11 UITabBarController

UINavigationController3d

利用UINavigationController,能夠輕鬆地管理多個控制器,輕鬆完成控制器之間的切換,典型例子就是系統自帶的"設置"應用代理

UINavigationController的使用步驟code

 1 1.初始化UINavigationController
 2 2.設置UIWindow的rootViewController爲UINavigationController
 3 3.根據具體狀況,經過push方法添加對應個數的子控制器
 4 
 5 UINavigationController以棧的形式保存子控制器
 6 @property(nonatomic,copy)NSArray *viewControllers;
 7 @property(nonatomic,readonly)NSArray *childViewControllers;
 8 
 9 使用push方法能將某個控制器壓入棧
10 -(void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;
11 
12 使用pop方法能夠移除控制器
13 //將棧頂的控制器移除
14 -(UIViewController *)popViewControllerAnimated:(BOOL)animated;
15 //回到指定的子控制器
16 -(NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated;
17 //回到根控制器(棧底控制器)
18 -(NSArray *)popToRootViewControolerAnimated:(BOOL) animated;

修改導航欄的內容orm

 1 導航欄的內容由棧頂控制器的navigationitem屬性決定
 2 
 3 UINavigationItem有如下屬性影響着導航欄的內容
 4 //左上角的返回按鈕
 5 @property(nonatomic,retain)UIBarButtonItem *backBarButtonItem;
 6 //中間的標題視圖
 7 @property(nonatomic, retain)UIView *titleView;
 8 //中間的標題文字
 9 @property(nonatomic,copy) NSString  *title;
10 //左上角的視圖
11 @property(nonatomic,retain)UIBarButtonItem *leftBarButtonItem;
12 //UIBarButtonItem *rightBarButtonItem 右上角的視圖
13 @property(nonatomic,retain) UIBarButtonItem *rightBarButtonItem;

Segue對象

Storyboard上每一根用來界面跳轉的線,都是一個UIStoryboardSegue對象(簡稱Segue)

Segue的屬性

每個segue對象,都有3個屬性

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

根據Segue的執行(跳轉)時刻,Segue能夠分爲2大類型

自動型:點擊某個控件後(好比按鈕),自動執行Segue,自動完成界面跳轉

手動型:須要經過寫代碼手動執行Segue,才能完成界面跳轉

 

自動型:

手動型:

performSegueWithldentifier:sender:

利用performSegueWithIdentifier:方法能夠執行某個Segue,完成界面跳轉

接下來研究performSegueWithIdentifier:sender:方法的完整執行過程

[self performSegueWithIdentifier:@"login2contacts" sender:nil];

//這個self是來源控制器

1.根據identifier去storyboard中找到對應的線,新建UIStoryboardSegue對象

設置Segue對象的sourceViewController(來源控制器)

新建而且設置Segue

2.調用sourceViewController的下面方法,作一些跳轉前的準備工做而且傳入建立好的Segue對象

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender: (id) sender;

//這個sender是當初performSegueWithIdentifier:sender:中傳入的sender

3.調用Segude對象的-(void)perform;方法開始執行界面跳轉操做

取得sourceViewController所在的UINavigationController

調用UINavigationController的push方法將destinationViewController壓入棧中,完成跳轉

[self performSegueWithIdentifier:@"login2contacts" sender:@"jack"];



-(void)perpareForSegue:(UIStoryboardSegue *)segue sender:(id)sender;

控制器的數據傳遞

控制器之間的數據傳遞主要有兩種狀況:順傳和逆傳

順傳

1 控制器的跳轉方向:A-->C
2 數據的傳遞方向:  A--->C
3 數據的傳遞方式: 在A的 perpareForSeque:sender 方法中根據segue參數取得destinationViewController,也就是控制器C,直接給控制器C傳遞數據
4 (要在C的viewDidLoad方法中取得數據,來賦值給界面上的UI控件)

逆傳

1 控制器的跳轉方向:A -->C
2 數據的傳遞方向: C-->A
3 數據的傳遞方式:讓A成爲C的代理,在C中調用A的代理方法,經過代理方法的參數傳遞數據給A
相關文章
相關標籤/搜索