您好,登錄后才能下訂單哦!
介紹多控制器管理中非常重要的一個控制器UINavigationController
它負責管理多個控制器,能夠輕松完成控制器間的切換
如:iOS系統上的設置
父類是UIViewController,但其功能并非是管理view,而是管理多個控制器
控制器棧式管理:
當切換時,將一個控制器入棧,當返回時,棧頂控制器出棧
當前顯示的永遠是棧頂控制器的view,棧結構如下:
@property(nonatomic, copy) NSArray *viewControllers //管理的所有控制器 @property(nonatomic, readonly, retain) UIViewController *topViewController //當前顯示的控制器
代碼使用導航控制器
導航控制器的創建:
- (instancetype)initWithRootViewController:(UIViewController *)rootViewController
rootViewController參數:根控制器,即管理的第一個頁面
跳轉動作:
使用導航控制器的pushViewController方法:
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
也就是說,跳轉動作的執行者是導航控制器,而不是源控制器
源控制器可以通過它的屬性訪問到導航控制器:
@property(nonatomic, readonly, retain) UINavigationController*navigationController
如一個跳轉動作:
AMViewController *vc = [[AMViewControllerTwo alloc] init]; [self.navigationController pushViewController:vc animated:YES];
返回動作:
非根控制器的導航欄上,都默認有一個返回按鈕,點擊此按鈕能夠自動返回
也可以通過代碼返回,導航控制器的方法:
- (UIViewController *)popViewControllerAnimated:(BOOL)animated //返回一個控制器 - (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated //返回到指定控制器 - (NSArray *)popToRootViewControllerAnimated:(BOOL)animated //返回到根控制器
storyboard使用導航控制器
刪除storyboard默認的控制器,添加 UINavigationController,并設置為初始控制器。
添加一個控制器,連接導航控制器的root view controller屬性
控制器間的跳轉可以直接連線,選擇show
同樣支持自動型Segue和手動型Segue
控制器之間傳遞數據和modal方式切換一樣
導航欄上按鈕的添加
導航欄上的按鈕類型是UIBarButtonItem
導航欄
導航控制器除了管理多個控制器外,還有一個到導航欄,相關屬性:
@property(nonatomic, readonly) UINavigationBar *navigationBar //導航欄 @property(nonatomic, getter=isNavigationBarHidden) BOOL navigationBarHidden //導航欄隱藏使能
導航欄上的數據由UINavigationItem對象管理,其屬性如下:
@property(nonatomic, copy) NSString *title //中間的標題 @property(nonatomic, retain) UIView *titleView //中間的視圖 @property(nonatomic, retain) UIBarButtonItem *backBarButtonItem //左側的返回按鈕 @property(nonatomic, retain) UIBarButtonItem *leftBarButtonItem //左側自定義按鈕 @property(nonatomic, copy) NSArray *leftBarButtonItems @property(nonatomic, retain) UIBarButtonItem *rightBarButtonItem //右側自定義按鈕 @property(nonatomic, copy) NSArray *rightBarButtonItems
導航欄對象UINavigationBar管理顯示數據的方式和導航控制器管理多個控制器類似,也是用棧的結構:
@property(nonatomic, copy) NSArray *items @property(nonatomic, readonly, retain) UINavigationItem *topItem
但通常不直接使用導航欄對象來設置顯示的數據
UIViewController包含一個navigationItem屬性:
@property(nonatomic, readonly, retain) UINavigationItem *navigationItem
通過這個屬性,能夠直接設置當前頁面的導航欄數據
工具欄
導航控制器還管理著一個工具欄,這個工具欄默認是隱藏的
@property(nonatomic, readonly) UIToolbar *toolbar - (void)setToolbarHidden:(BOOL)hidden animated:(BOOL)animated @property(nonatomic, getter=isToolbarHidden) BOOL toolbarHidde
工具欄UIToolBar管理方式導航欄UINavigationBar的管理方式類似
UIViewController包含一個tabBarItem屬性:
@property(nonatomic, readonly, retain) UINavigationItem *navigationItem
通過這個屬性,能夠直接設置當前頁面的工具欄數據
@property(nonatomic, retain) UITabBarItem *tabBarItem
導航控制器子類
定義一個導航控制器子類的好處是:
讓項目中所有的導航控制器都遵循統一的一些行為,應讓所有的導航控制器為自定義的UINavigationController的子類,在子類中設定這些統一的行為。
UINavigationBar設置背景圖片
- (void)setBackgroundImage:(UIImage *)backgroundImage forBarMetrics:(UIBarMetrics)barMetrics
UINavigationBar設置文字屬性
@property(nonatomic, copy) NSDictionary *titleTextAttributes
一些控件遵循<UIAppearance>協議,通過協議中的appearance方法能夠返回全局對象
+ (instancetype)appearance
通過全局對象能夠設置一些全局的特征
設置導航欄的tintColor
[UINavigationBar appearance].tintColor = [UIColor whiteColor];
設置導航欄按鈕的字體
[UIBarButtonItem appearance] setTitleTextAttributes:attrDict forState:UIControlStateNormal];
全局的屬性設置,執行一次即可
將這些代碼放在導航控制器的viewDidLoad方法中,當出現多個導航控制器時,全局屬性設置會執行多次。
保證全局屬性只執行一次的方案是添加到initialize方法中
另外可以使用一個類,管理所有UIKit對象的appearance的設置,用以實現App皮膚的切換
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。