[UI]谁才是劳务派遣的临时工-present与push的对比使用
文章目录
前情回顾
其实区分 push 和 present 还是不难的
通过使用不难发现在 navigationViewController 为调用方法的对象时用 push 其他时候用present
使用后友方切入视图的是 push 而下方弹出来的是 present
当然不绝对哈 大家都知道 present 方法可以设置视图弹出模式的
当然 最主要的
push
push由视图栈控制,每一个视图都入栈,调用之前的视图则需要出栈,可返回任意一层,一般用于同一业务不同界面之间的切换。push是由UINavigationController管理的视图控制器堆栈,在window下同时只能显示一个ViewController
present
present弹出的视图是模态视图(我对模态视图的理解大概就是一个临时视图),只能逐级返回,一般用于不同业务界面的切换。
present是由UIViewController管理的视图控制器堆栈,在window下可以以叠加的方式展示,当顶层的view透明时可以看到底层的view,但只有顶层的view可用户交互
一言蔽之
push 出来的是有中央垂直管理的正式工
present 出来的更像是顶包的劳务派遣临时工
present和dismiss
[self presentViewController:newViewController animated:YES completion:nil];
//present下一界面
[self dismissViewControllerAnimated:YES completion:nil];
//dismiss上一界面
pop和push
[self.navigationController pushViewController:vc animated:YES];
//push下一界面
[self.navigationController popViewControllerAnimated:YES];
//返回上一界面
[self.navigationController popToViewController:vc2 animated:YES];
//返回指定界面
[self.navigationController popToRootViewControllerAnimated:YES];
//返回第一界面
多级跳转
这里要讲 dismiss 方法实现多级页面的跳转
首先谈一下 dismiss 方法
之前学方法的时候夸过 OC的方法使用有个有点 主语 + 谓语(即动词)+ 宾语
不难发现前面介绍的 A dismiss 主语是 A 且没有宾语
那就只是对A进行操作 将A上先前 present 的视图删除 回到A视图控制器
此外
如果您连续显示多个视图控制器,从而构建一个显示的视图控制器堆栈,则在堆栈中较低的视图控制器上调用此方法会解除其直接子视图控制器和堆栈中该子级以上的所有视图控制器。当发生这种情况时,只有最上面的视图以动画的方式被取消;任何中间视图控制器都只是从堆栈中删除。最上面的视图将使用其模态转换样式来消除,这可能与堆栈中较低的其他视图控制器使用的样式不同。
在讲之前再介绍两个属性
presentedViewController:由这个视图控制器或它最近的祖先呈现的视图控制器
presentingViewController:呈现此视图控制器(或其最远祖先)的视图控制器
这两个概念在使用Modal视图控制器时非常有用,因为它们允许您跟踪当前视图控制器的状态以及它所呈现的视图控制器
区别
presentedViewController和presentingViewController是UIViewController中的两个属性,例如,如果ViewControllerA调用present(_:animated:completion:)方法将ViewControllerB呈现出来,那么ViewControllerA就是presentingViewController,ViewControllerB就是presentedViewController
就是 在视图控制器由A->B后
B.presentingViewController = A
A.presentedViewController = B
小葵花妈妈课堂开课啦
那么 回归正题 怎么一下子 dismiss 好多个视图控制器呢?
这个问题小编也很好奇 让我们一起来看看吧
到根视图
通过 while 循环一直到没有当前视图控制器没有 presenting 视图控制器 那么这个视图控制器就是根视图控制器了
UIViewController *rootVC = self.presentingViewController;
while (rootVC. presentingViewController ) {
rootVC = rootVC.presentingViewController ;
}
[rootVC dismissViewControllerAnimated:YES completion:nil];
对了 这里的 nil 怎么理解呢
当view被添加到其他view中之前,会调用viewWillAppear,之后会调用viewDidAppear。当view从其他view中移除之前,调用viewWillDisAppear,移除之后会调用viewDidDisappear。当view不再使用时,受到内存警告时,ViewController会将view释放并将其指向为nil
到指定级
也不难 比如 dismiss 两个视图控制器
只需要一行
[self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:nil];
到目标级
通过 isKindOfClass 方法 忘记的同学可以复习一下
UIViewController *rootVC = self.presentingViewController;
while (![rootVC isKindOfClass:[SecondViewController class]]) {
rootVC = rootVC.presentingViewController;
}
[rootVC dismissViewControllerAnimated:YES completion:nil];