IOS 多层级路由导航控制器 NavigationControoller 实现路由切换
IOS 導航控制器分為多層級導航控制器naviagtionController 和平行分欄控制器 UITabBar(底部切換欄)。IOS導航控制器是什么呢?其實就是我們web的路由切換功能,只不過在app開發切換是ViewController。
什么是導航控制器 NavigationController ?
NavigationController 是繼承ViewController實現的,我們可以理解為一個具有切換視圖并保存視圖棧記錄的一個視圖控制器,在開發中我們應該如何使用呢?那么NavigationController 是一個ViewController 說明我們可以把APP根視圖替換成NavigationController進行路由。下面我們進行簡單代碼示例:
1. 首先修改SceneDeletgate自定義UIWindow和跟視圖實現導航控制器
自定義UIWindow我們需要對info.plist修改一下配置,具體參考之前寫的 Xcode11 后Appdelegate自定義UIWindow對象
// SceneDeletegate.m - (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {self.window = [[UIWindow alloc] initWithWindowScene:(UIWindowScene* )scene];self.window.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height);// 初始化第一級視圖UIViewController* ROOTVC = [[ViewController alloc] init];// 初始化層級導航控制器UINavigationController* ROOTNavigation = [[UINavigationController alloc]initWithRootViewController:ROOTVC];self.window.rootViewController = ROOTNavigation;// 顯示[self.window makeKeyAndVisible]; }修改一下第一級視圖的代碼
ViewController.m - (void)viewDidLoad {[super viewDidLoad];// 設置導航欄的顏色self.navigationController.navigationBar.barTintColor = [UIColor whiteColor];// 設置導航欄文字顏色self.navigationController.navigationBar.tintColor = [UIColor grayColor];// 修改本視圖的導航標題self.navigationItem.title = @"首頁";self.view.backgroundColor = [UIColor grayColor]; }效果:
可以看到上ViewController代碼self.navigationItem進行配置標題、self.navigationController配置顏色風格等。
self.navigationController 是什么?
每個視圖控制器UIViewController都具有navigationController屬性,這個屬性指向是當前視圖的導航控制器對象,也是當前導航控制器下視圖都是指向它,其中一個UIViewController修改了NaviagtionConrtoller的屬性其他視圖層的導航控制器也會發生變化的。
self.navigationItem 是什么?
navigationItem屬性其實是每個視圖的導航欄配置項,可以單獨配置當前的視圖的導航的標題、左右兩邊按鈕、顏色、風格等,只在當前視圖層激活時候才生效。
如何切換視圖 pushViewController
我們可以通過調用NavigationController的方法進行視圖切換,下面簡單演示一下視圖切換功能。
// ViewController.m - (void)viewDidLoad {[super viewDidLoad];// 設置導航欄的顏色self.navigationController.navigationBar.barTintColor = [UIColor whiteColor];// 設置導航欄文字顏色self.navigationController.navigationBar.tintColor = [UIColor grayColor];// 修改本視圖的導航標題self.navigationItem.title = @"首頁";self.view.backgroundColor = [UIColor grayColor];UIButton* _btn = [MyUI createButton:@"跳轉"];_btn.frame = CGMakeRect(100, 100, 40, 100);[_btn addTarget:self action:@selector(go:) forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:_btn];}- (void) go {UIViewController* view = [[UIViewController alloc] init][self.navigationController pushViewController:view animated:YES]; }通過點擊我們看到路由發生了切換和后退等功能。
UINavigationController 屬性
| topViewController | UIViewController | 棧堆中的頂層視圖控制器 | |
| visibleViewController | UIViewController | 返回當前激活(即顯示)的視圖控制器,如果不存在激活的視圖,則返回棧堆中頂層的視圖控制器 | |
| viewControllers | NSArray<__kindof UIViewController *> | 當前導航控制器的視圖棧堆 | [] |
| navigationBarHidden | BOOL | 隱藏導航欄 | NO |
| navigationBar | UINavigationBar | 導航控制器的導航欄對象 | UINavigationBar |
| toolbarHidden | BOOL | 隱藏工具欄 | YES |
| toolbar | UIToolbar | 導航控制器工具欄對象 | UIToolbar |
UINavigationController 方法
-
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated 是否開啟動畫切換視圖,并且壓入導航棧堆。
-
- (nullable UIViewController *)popViewControllerAnimated:(BOOL)animated; 從棧堆彈出當前視圖。并且返回剩余的視圖棧堆
-
- (nullable NSArray<__kindof UIViewController *> *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated 彈出視圖棧堆,直到指定的視圖控制器前面
-
- (nullable NSArray<__kindof UIViewController *> *)popToRootViewControllerAnimated:(BOOL)animated 直接恢復到頂級視圖層。
-
- (void)setViewControllers:(NSArray<UIViewController *> *)viewControllers animated:(BOOL)animated API_AVAILABLE(ios(3.0)) 直接設置新的視圖棧堆,會跟當前頂級視圖狀態和新的視圖棧堆來執行后退還是前進。
-
- (void)setNavigationBarHidden:(BOOL)hidden animated:(BOOL)animated 隱藏導航欄
-
- (void)setToolbarHidden:(BOOL)hidden animated:(BOOL)animated隱藏工具欄
…后續補充更多內容
總結
以上是生活随笔為你收集整理的IOS 多层级路由导航控制器 NavigationControoller 实现路由切换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html中删除代码怎么写,html空格代
- 下一篇: GoLand中的指针操作 * 和