1.UIWindow
* 主窗口的概念
* 新建UIWindow
2.UIViewController
* 控制器的創建方式
* 控制器view的創建方式
* view的懶加載
* loadView、viewDidLoad、viewDidUnload、didReceiveMemoryWarning
3.UINavigationController
* 通過“設置”演示基本用處
* 通過非storyboard方式,感受導航的作用
1> 創建導航控制器
2> 設置UIWindow的根控制器
3> push 1個、2個、3個 子控制器
4> 解釋push的原理(棧、導航控制器的管理進程)
5> 棧底、棧頂控制器的概念
6> 如何設置導航欄上面的內容、返回文字的設置
7> pop的方法使用
8> push和addChild、viewControllers和childViewController的關系
* 通過storyboard方式,感受導航的作用
4.UIViewController的生命周期方法、AppDelegate的生命周期方法
如何創建1個控制器
控制器常見的創建方式有以下幾種
通過storyboard創建
直接創建
控制器常見的創建方式有以下幾種
通過storyboard創建
直接創建
GYLViewController *nj = [[GYLViewController alloc] init];
指定xib文件來創建
GYLViewController *nj = [[GYLViewController alloc] initWithNibName:@”GYLViewController" bundle:nil];
先加載storyboard文件(Test是storyboard的文件名)
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Test" bundle:nil];
接著初始化storyboard中的控制器
初始化“初始控制器”(箭頭所指的控制器)
GYLViewController *nj = [storyboard instantiateInitialViewController];
通過1個標識初始化對應的控制器
GYLViewController *nj = [storyboard instantiateViewControllerWithIdentifier:@”nj"];
控制器view的延遲加載
控制器的view是延遲加載的:用到時再加載
可以用isViewLoaded方法判斷1個UIViewController的view是不是已被加載
控制器的view加載終了就會調用viewDidLoad方法
多控制器
1個iOS的app很少只由1個控制器組成,除非這個app極為簡單
當app中有多個控制器的時候,我們就需要對這些控制器進行管理
有多個view時,可以用1個大的view去管理1個或多個小view
控制器也是如此,用1個控制器去管理其他多個控制器
比如,用1個控制器A去管理3個控制器B、C、D
控制器A被稱為控制器B、C、D的“父控制器”
控制器B、C、D的被稱為控制器A的“子控制器”
為了便于管理控制器,iOS提供了2個比較特殊的控制器
UINavigationController
UITabBarController
UINavigationController的簡單使用
UINavigationController以棧的情勢保存子控制器
@property(nonatomic,copy) NSArray *viewControllers;
@property(nonatomic,readonly) NSArray *childViewControllers;
使用push方法能將某個控制器壓入棧
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;
使用pop方法可以移除控制器
將棧頂的控制器移除
- (UIViewController *)popViewControllerAnimated:(BOOL)animated;
回到指定的子控制器
- (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated;
回到根控制器(棧底控制器)
- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated;
如何修改導航欄的內容
導航欄的內容由棧頂控制器的navigationItem屬性決定
UINavigationItem有以下屬性影響著導航欄的內容
左上角的返回按鈕
@property(nonatomic,retain) UIBarButtonItem *backBarButtonItem;
中間的標題視圖
@property(nonatomic,retain) UIView *titleView;
中間的標題文字
@property(nonatomic,copy) NSString *title;
左上角的視圖
@property(nonatomic,retain) UIBarButtonItem *leftBarButtonItem;
UIBarButtonItem *rightBarButtonItem 右上角的視圖
@property(nonatomic,retain) UIBarButtonItem *rightBarButtonItem;
Segue的屬性
每個Segue對象,都有3個屬性
唯1標識
@property (nonatomic, readonly) NSString *identifier;
來源控制器
@property (nonatomic, readonly) id sourceViewController;
目標控制器
@property (nonatomic, readonly) id destinationViewController;
Segue的類型
根據Segue的履行(跳轉)時刻,Segue可以分為2大類型
自動型:點擊某個控件后(比如按鈕),自動履行Segue,自動完成界面跳轉
手動型:需要通過寫代碼手動履行Segue,才能完成界面跳轉
自動型Segue
按住Control鍵,直接從控件拖線到目標控制器
點擊“登錄”按鈕后,就會自動跳轉到右側的控制器
如果點擊某個控件后,不需要做任何判斷,1定要跳轉到下1個界面,建議使用“自動型Segue”
手動型Segue
按住Control鍵,歷來源控制器拖線到目標控制器
手動型的Segue需要設置1個標識(如右圖)
在恰當的時刻,使用perform方法履行對應的Segue
[self performSegueWithIdentifier:@"login2contacts" sender:nil];
// Segue必須由來源控制器來履行,也就是說,這個perform方法必須由來源控制器來調用
如果點擊某個控件后,需要做1些判斷,也就是說:滿足1定條件后才跳轉到下1個界面,建議使用“手動型Segue”
performSegueWithIdentifier:sender:
利用performSegueWithIdentifier:方法可以履行某個Segue,完成界面跳轉
接下來研究performSegueWithIdentifier:sender:方法的完全履行進程
[self performSegueWithIdentifier:@“login2contacts” sender:nil];
// 這個self是來源控制器
根據identifier去storyboard中找到對應的線,新建UIStoryboardSegue對象
設置Segue對象的sourceViewController(來源控制器)
新建并且設置Segue對象的destinationViewController(目標控制器)
performSegueWithIdentifier:sender:
調用sourceViewController的下面方法,做1些跳轉前的準備工作并且傳入創建好的Segue對象
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender;
// 這個sender是當初performSegueWithIdentifier:sender:中傳入的sender
調用Segue對象的- (void)perform;方法開始履行界面跳轉操作
獲得sourceViewController所在的UINavigationController
調用UINavigationController的push方法將destinationViewController壓入棧中,完成跳轉
Sender參數的傳遞
[self performSegueWithIdentifier:@“login2contacts” sender:@“jack”];
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender;
控制器的數據傳遞
控制器之間的數據傳遞主要有2種情況:順傳和逆傳
順傳
控制器的跳轉方向: A C
數據的傳遞方向 : A C
數據的傳遞方式 : 在A的prepareForSegue:sender:方法中根據segue參數獲得destinationViewController, 也就是控制器C, 直接給控制器C傳遞數據
(要在C的viewDidLoad方法中獲得數據,來賦值給界面上的UI控件)
逆傳
控制器的跳轉方向: A C
數據的傳遞方向 : C A
數據的傳遞方式 : 讓A成為C的代理, 在C中調用A的代理方法,通過代理方法的參數傳遞數據給A
1.UIWindow
* 主窗口的概念
* 新建UIWindow
2.UIViewController
* 控制器的創建方式
* 控制器view的創建方式
* view的懶加載
* loadView、viewDidLoad、viewDidUnload、didReceiveMemoryWarning
3.UINavigationController
* 通過“設置”演示基本用處
* 通過非storyboard方式,感受導航的作用
1> 創建導航控制器
2> 設置UIWindow的根控制器
3> push 1個、2個、3個 子控制器
4> 解釋push的原理(棧、導航控制器的管理進程)
5> 棧底、棧頂控制器的概念
6> 如何設置導航欄上面的內容、返回文字的設置
7> pop的方法使用
8> push和addChild、viewControllers和childViewController的關系
* 通過storyboard方式,感受導航的作用
4.UIViewController的生命周期方法、AppDelegate的生命周期方法
如何創建1個控制器
控制器常見的創建方式有以下幾種
通過storyboard創建
直接創建
控制器常見的創建方式有以下幾種
通過storyboard創建
直接創建
GYLViewController *nj = [[GYLViewController alloc] init];
指定xib文件來創建
GYLViewController *nj = [[GYLViewController alloc] initWithNibName:@”GYLViewController" bundle:nil];
先加載storyboard文件(Test是storyboard的文件名)
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Test" bundle:nil];
接著初始化storyboard中的控制器
初始化“初始控制器”(箭頭所指的控制器)
GYLViewController *nj = [storyboard instantiateInitialViewController];
通過1個標識初始化對應的控制器
GYLViewController *nj = [storyboard instantiateViewControllerWithIdentifier:@”nj"];
控制器view的延遲加載
控制器的view是延遲加載的:用到時再加載
可以用isViewLoaded方法判斷1個UIViewController的view是不是已被加載
控制器的view加載終了就會調用viewDidLoad方法
多控制器
1個iOS的app很少只由1個控制器組成,除非這個app極為簡單
當app中有多個控制器的時候,我們就需要對這些控制器進行管理
有多個view時,可以用1個大的view去管理1個或多個小view
控制器也是如此,用1個控制器去管理其他多個控制器
比如,用1個控制器A去管理3個控制器B、C、D
控制器A被稱為控制器B、C、D的“父控制器”
控制器B、C、D的被稱為控制器A的“子控制器”
為了便于管理控制器,iOS提供了
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈