1、self.view addSubView:view、self.window addSubView,需要注意的是,這個方法只是把頁面加在當前頁面。
UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow];
[keyWindow addSubview:historynav.view];
dispatch_async(dispatch_get_main_queue(), ^ {
UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow];
[keyWindow addSubview:historynav.view];
});
此時在用self.navigationControler.pushViewController和 popViewController 是不行的。要想使用pushViewController和popViewController進行視圖間的切換,就必須要求當前視圖是個NavigationController。
2、使用self.navigationControler pushViewController和popViewController來進行視圖切換的,pushViewController是進入到下一個視圖,popViewController是返回到上一視圖。
3、沒有NavigationController導航欄的話,使用self.presentViewController和self.dismissModalViewController實現(xiàn)控制器之間的切換,不能用作視圖之間的切換。
4、要想使用pushViewController和popViewController來進行視圖切換,首先要確保根視圖是NavigationController,不然是不可以用的。這里提供一個簡單的方法讓該視圖或者根視圖是NavigationController。自己定義個子類繼承UINavigationController,然后將要展現(xiàn)的視圖包裝到這個子類中,這樣就可以使這個視圖是個NavigationController了。提供的這個方法有很好的好處,就是可以統(tǒng)一的控制各個視圖的屏幕旋轉。
注意:
1、
在變成過程中,經(jīng)常遇到兩個視圖控制器之間的切換,導航控制器即UINaVigation是最常用的一種,有時為了某些效果又需要進行模態(tài)切換,即present。
我們的布局經(jīng)常是在window上加一個nav,然后以viewControl作為nav的根視圖進行導航。如果在導航之間有了一個present之后,你會發(fā)現(xiàn)當前頁面的navigationController是空的,也就是說導航控制器不管用了
下面就給大家介紹兩種比較有效的方法:
第一:在進行present之前,重新生成一個導航控制器,然后將下一個視圖作為新生成的導航控制器的跟視圖,將導航控制器present就行了,
ThirdViewController *thirdCtr=[[ThirdViewController alloc]init];
UINavigationController *nav=[[UINavigationController alloc]initWithRootViewController:thirdCtr];
[self presentViewController:nav animated:YES completion:nil];
這樣的話問題基本解決了,但就是沒有回到最初的跟視圖,只能在當前的導航控制器之間切換。
第二種方法就比較好了,獲取當前的window實例,在得到widow的跟視圖,即為導航器,然后根據(jù)導航器的索引就可以找到當前的視圖了
FourthViewController *fourth=[[FourthViewController alloc]init];
UIWindow *window=[[UIApplication sharedApplication]keyWindow];
UINavigationController *nav0=(UINavigationController *)window.rootViewController;
UIViewController *viewController=[nav0.viewControllers objectAtIndex:1];
[viewController.navigationController pushViewController:fourth animated:YES];
2、push present的區(qū)別
present一般用于臨時性彈出一個頁面;而push一般用于邏輯上的層次關系的應用,能夠適應更加復雜一點的場景,畢竟導航控制器提供了多頁面管理方法。
3、遇到的問題
Warning: Attempt to present * on * which is already presenting (null)