iOS push和present区别以及混用
push与present都可以推出新的界面。
present与dismiss对应,push和pop对应。
present只能逐级返回,push所有视图由视图栈控制,可以返回上一级,也可以返回到根vc,其他vc。
present一般用于不同业务界面的切换,push一般用于同一业务不同界面之间的切换
在开发过程中,经常遇到两个视图控制器之间的切换,导航控制器即UINaVigation是最常用的一种,有时为了某些效果又需要进行模态切换,即present。
我们的布局经常是在window上加一个nav,然后以viewControl作为nav的根视图进行导航。如果在导航之间有了一个present之后,你会发现当前页面的navigationController是空的,也就是说导航控制器不管用了。下面我就介绍几种解决方法
方法一
在进行present之前,重新生成一个导航控制器,然后将下一个视图作为新生成的导航控制器的跟视图,将导航控制器present就行了看代码:
ViewController *VC=[[ViewController alloc]init];
UINavigationController *nav=[[UINavigationController alloc]initWithRootViewController:VC];
[self presentViewController:nav animated:YES completion:nil];
这样的话问题基本解决了,但就是没有回到最初的跟视图,只能在当前的导航控制器之间切换
方法二
获取当前的window实例,在得到widow的跟视图,即为导航器,然后根据导航器的索引就可以找到当前的视图啦
// 先取消原来的控制器
[self dismissViewControllerAnimated:NO completion:nil];
ViewController *VC=[[ViewController alloc]init];
UIWindow *window=[[UIApplication sharedApplication]keyWindow];
UINavigationController *nav0=(UINavigationController *)window.rootViewController;
UIViewController *viewController=[nav0.viewControllers objectAtIndex:1];
[viewController.navigationController pushViewController:VC animated:YES];
判断当前viewcontroller是push还是present的方式显示的
NSArray *viewcontrollers=self.navigationController.viewControllers;
if (viewcontrollers.count>1) {
if ([viewcontrollers objectAtIndex:viewcontrollers.count-1]==self) {
//push方式
[self.navigationController popViewControllerAnimated:YES];
}
}
else{
//present方式
[self.navigationController dismissViewControllerAnimated:YES completion:nil];
}
通过presentviewcontroller的方式显示的viewcontroller不会存入self.navigationController.viewControllers数组中。而通过push方式显示的viewcontroller会存在该数组的最后。
tabbar同级之间跳转
方法一
AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
TarbarViewController *tab = (TarbarViewController *)delegate.window.rootViewController;
tab.selectedIndex = 1;
方法2
平时我们可能会有这样的需求,在第一个tabBar1的界面中,我们点击了当前页面上的某个控件,让显示第n个tabBar上的内容,相当于从一个tabBar1跳转另一个tabBar(n),其实这个很简单,在当前tabBar1界面控件的事件中加一行代码即可
self.tabBarController.selectedIndex = 2; //(2为要跳转的索引)
隐藏返回键
self.navigationItem.hidesBackButton=YES;
使用这句代码就可以隐藏了。