一.定义区别
- pushViewController 导航栏控制器入栈的方式切换页面(pop可以返回任意一层)push一般用于同一业务不同界面之间的切换(也就是只能导航栏间的切换,从第二个导航栏到第三个导航栏)
- (void) pass {
NSLog(@"pass to third");
//第三个同样是导航栏,而且两个导航栏之间可以自由返回
ThirdViewController *thirdVC = [[ThirdViewController alloc] init];
[self.navigationController pushViewController:thirdVC animated:YES];
}
- presentViewController模式切换的方式切换页面(dismiss只能逐级返回)present一般用于不同业务界面的切换。
若是由视图页面转到导航栏,要先建立一个导航栏。
//出来一个navigation
SecondViewController *secondVC = [[SecondViewController alloc] init];
UINavigationController *navSecondVC = [[UINavigationController alloc] initWithRootViewController:secondVC];
navSecondVC.modalPresentationStyle = UIModalPresentationFullScreen;
[self presentViewController:navSecondVC animated:YES completion:nil];
若是两个视图间,直接用present即可
- (void) press {
NSLog(@"press 01");
SecondViewController *secondVC = [[SecondViewController alloc] init];
secondVC.modalPresentationStyle = UIModalPresentationFullScreen;
[self presentViewController:secondVC animated:YES completion:nil];
}
二. 返回方法
- push和pop对应
用UINavigationController的时候用pushViewController:animated返回之前的视图[[self navigationController] popViewControllerAnimated:YES]; push以后会在navigation的left bar自动添加back按钮,所以一般不用写返回,点back方法即可
有关pop,pop一般返回一级和左上角的back的作用是一样的,所以它的用处在于可以分级返回
//返回上一视图
[self.navigationController popViewControllerAnimated:YES];
//返回根视图(to root)
[self.navigationController popToRootViewControllerAnimated:YES];
//返回任意视图(atindex后加返回的层数)
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:0] animated:YES];
- present和dismiss对应presentModalViewController:animated
[self presentModalViewController:controller animated:YES];
返回之前的视图 [self dismissModalViewControllerAnimated:YES];
dismiss在导航栏和页面中都可以使用,在页面中即返回上一级页面,在导航栏中使用的话是返回到所有导航栏前的一个页面,但是写法是相同的。
- (void) backDiss {
NSLog(@"backdiss");
[self dismissViewControllerAnimated:YES completion:nil];
}
三.使用区别
- [self presentModalViewController:controller animated:YES];主语是UIVIewController,即单纯页面切换
- [self.navigationController pushViewController:upViewController animated:YES];与[self.navigationController popViewControllerAnimated:YES];这两句时主语是navigationController,所以如果是在导航栏上实现页面的跳转使用push,除此之外的都是用present
代码
2020-10-04 23:15:46.330677+0800 present和push[79292:5066460] press 01 to
2020-10-04 23:16:19.915102+0800 present和push[79292:5066460] pass to third
2020-10-04 23:16:42.522594+0800 present和push[79292:5066460] backPop to Second
2020-10-04 23:16:47.412832+0800 present和push[79292:5066460] pass to third
2020-10-04 23:16:48.862871+0800 present和push[79292:5066460] backdiss to First(dissmiss因为上一级页面是第一个,两个导航栏是同一级页面)
2020-10-04 23:17:01.976698+0800 present和push[79292:5066460] press 01 to
2020-10-04 23:17:04.255234+0800 present和push[79292:5066460] pass to four
2020-10-04 23:17:12.925467+0800 present和push[79292:5066460] back2 ?->dissmiss second(因为上一级页面是第二个)
2020-10-04 23:18:01.000129+0800 present和push[79292:5071067] [ServicesDaemonManager] interruptionHandler is called. -[FontServicesDaemonManager connection]_block_invoke
我写的代码,第一个视图present到第二个(导航栏)。第二个push到第三个(导航栏),第三个可以通过dismiss返回到第一个,也可以通过pop回到第二个。第二个还可以present到第四个(一个界面),第四个通过dismiss回到第二个(导航栏)。如下图: