控制器管理UINavigationController、UINavigationBar

來源:互聯網
上載者:User

標籤:

控制器管理

 

掌握

控制器以及view的多種建立方式

 

UINavigationController的簡單使用:添加\移除子控制器

 

UINavigationBar內容的設定

 

控制器的生命週期方法

 

Segue的使用

 

控制器之間資料的傳遞

 

UITabBarController的簡單使用

 

UITabBarController和UINavigationController的混合使用

 

Modal

 

 

如何建立一個控制器

控制器常見的建立方式有以下幾種

Ø通過storyboard建立

 

Ø直接建立

MJViewController *mj = [[MJViewController alloc] init];

ØØ指定xib檔案來建立

MJViewController *mj = [[MJViewController alloc] initWithNibName:@"MJViewController" bundle:nil];

通過storyboard建立控制器

先載入storyboard檔案(Test是storyboard的檔案名稱)

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Test" bundle:nil];

 

接著初始化storyboard中的控制器

Ø初始化“初始控制器”(箭頭所指的控制器)

MJViewController *mj = [storyboard instantiateInitialViewController];

ØØ通過一個標識初始化對應的控制器

MJViewController *mj = [storyboard instantiateViewControllerWithIdentifier:@”mj"];

MJViewController的view的建立

控制器view的消極式載入

控制器的view是消極式載入的:用到時再載入

 

可以用isViewLoaded方法判斷一個UIViewController的view是否已經被載入

 

控制器的view載入完畢就會調用viewDidLoad方法

多控制器

一個iOS的app很少只由一個控制器組成,除非這個app極其簡單

 

當app中有多個控制器的時候,我們就需要對這些控制器進行管理

 

有多個view時,可以用一個大的view去管理1個或者多個小view

 

控制器也是如此,用1個控制器去管理其他多個控制器

 

比如,用一個控制器A去管理3個控制器B、C、D

Ø控制器A被稱為控制器B、C、D的“父控制器”Ø控制器B、C、D的被稱為控制器A的“子控制器”Ø

為了便於管理控制器,iOS提供了2個比較特殊的控制器

ØUINavigationControllerØUITabBarController

UINavigationController

利用UINavigationController,可以輕鬆地管理多個控制器,輕鬆完成控制器之間的切換,典型例子就是系統內建的“設定”應用

 

 

UINavigationController的簡單使用

UINavigationController的使用步驟

Ø初始化UINavigationControllerØ設定UIWindow的rootViewController為UINavigationControllerØ根據具體情況,通過push方法添加對應個數的子控制器

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;

UINavigationController的view結構

如何修改導覽列的內容

導覽列的內容由棧頂控制器的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

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

 

 

 

Segue的屬性

每一個Segue對象,都有3個屬性

Ø唯一標識

@property (nonatomic, readonly) NSString *identifier;

Ø來源控制器

@property (nonatomic, readonly) id sourceViewController;

Ø目標控制器

@property (nonatomic, readonly) id destinationViewController;

Segue的類型

根據Segue的執行(跳轉)時刻,Segue可以分為2大類型

Ø自動型:點擊某個控制項後(比如按鈕),自動執行Segue,自動完成介面跳轉

 

Ø手動型:需要通過寫代碼手動執行Segue,才能完成介面跳轉

自動型Segue

按住Control鍵,直接從控制項拖線到目標控制器

 

 

 

 

 

 

 

 

點擊“登入”按鈕後,就會自動跳轉到右邊的控制器

 

如果點擊某個控制項後,不需要做任何判斷,一定要跳轉到下一個介面,建議使用“自動型Segue”

手動型Segue

按住Control鍵,從來源控制器拖線到目標控制器

 

 

 

 

 

 

手動型的Segue需要設定一個標識(如右圖)

 

 

在恰當的時刻,使用perform方法執行對應的Segue

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

// Segue必須由來源控制器來執行,也就是說,這個perform方法必須由來源控制器來調用

 

如果點擊某個控制項後,需要做一些判斷,也就是說:滿足一定條件後才跳轉到下一個介面,建議使用“手動型Segue”

 

performSegueWithIdentifier:sender:

利用performSegueWithIdentifier:方法可以執行某個Segue,完成介面跳轉

 

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

[self performSegueWithIdentifier:@“login2contacts” sender:nil];

// 這個self是來源控制器

1.根據identifier去storyboard中找到對應的線,建立UIStoryboardSegue對象Ø設定Segue對象的sourceViewController(來源控制器)Ø建立並且設定Segue對象的destinationViewController(目標控制器)

performSegueWithIdentifier:sender:

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

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

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

 

3.調用Segue對象的- (void)perform;方法開始執行介面跳轉操作(1)如果segue的style是pushØ取得sourceViewController所在的UINavigationControllerØ調用UINavigationController的push方法將destinationViewController壓入棧中,完成跳轉(2)如果segue的style是modalØ調用sourceViewController的presentViewController方法將destinationViewController展示出來

Sender參數的傳遞

控制器的資料傳遞

控制器之間的資料傳遞主要有2種情況:順傳和逆傳

Ø順傳n控制器的跳轉方向: A à Cn資料的傳遞方向    : A à Cn資料的傳遞方式    :  在A的prepareForSegue:sender:方法中根據segue參數取得destinationViewController, 也就是控制器C, 直接給控制器C傳遞資料

(要在C的viewDidLoad方法中取得資料,來賦值給介面上的UI控制項)

控制器的資料傳遞

Ø逆傳n控制器的跳轉方向: A à Cn資料的傳遞方向    : C à An資料的傳遞方式    :  讓A成為C的代理, 在C中調用A的代理方法,通過代理方法的參數傳遞資料給A

 

UITabBarController

跟UINavigationController類似,UITabBarController也可以輕鬆地管理多個控制器,輕鬆完成控制器之間的切換,典型例子就是QQ、等應用

 

 

UITabBarController的簡單使用

UITabBarController的使用步驟

Ø初始化UITabBarControllerØ設定UIWindow的rootViewController為UITabBarControllerØ根據具體情況,通過addChildViewController方法添加對應個數的子控制器

UITabBarController的子控制器

UITabBarController添加控制器的方式有2種

Ø添加單個子控制器

- (void)addChildViewController:(UIViewController *)childController;

 

Ø設定子控制器數組

@property(nonatomic,copy) NSArray *viewControllers;

 

UITabBarController的view結構

UITabBar

如果UITabBarController有N個子控制器,那麼UITabBar內部就會有N個UITabBarButton作為子控制項

 

如果UITabBarController有4個子控制器,那麼UITabBar的結構大致如所示

UITabBarButton

UITabBarButton裡面顯示什麼內容,由對應子控制器的tabBarItem屬性決定

 

 

 

UITabBarItem有以下屬性影響著UITabBarButton的內容

Ø標題文字

@property(nonatomic,copy) NSString *title;

 

Ø表徵圖

@property(nonatomic,retain) UIImage *image;

 

Ø選中時的表徵圖

@property(nonatomic,retain) UIImage *selectedImage;

 

Ø提醒數字

@property(nonatomic,copy) NSString *badgeValue;

 

 

App主流UI架構結構

 

Modal

除了push之外,還有另外一種控制器的切換方式,那就是Modal

 

任何控制器都能通過Modal的形式展示出來

 

Modal的預設效果:新控制器從螢幕的最底部往上鑽,直到蓋住之前的控制器為止

 

以Modal的形式展示控制器

- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion

 

關閉當初Modal出來的控制器

- (void)dismissViewControllerAnimated: (BOOL)flag completion: (void (^)(void))completion;

 

控制器管理UINavigationController、UINavigationBar

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.