Push和Modal的区别
标签(空格分隔): 知识补充
- 切换控制器的两种方法:push,modal
Push(代码方式,storyboa方式)
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;
// Uses a horizontal slide transition. Has no effect if the view controller is already in the stack.
- (UIViewController *)popViewControllerAnimated:(BOOL)animated;
// Returns the popped controller.
- (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated;
// Pops view controllers until the one specified is on top. Returns the popped controllers.
- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated;
// Pops until there's only a single view controller left on the stack. Returns the popped controllers.
- push方法切换控制器是通过导航控制器来实现,导航控制器的作用相当于是要切换的几个控制器之间的管理者(导航控制器的栈来管理),跳转后,原来的控制器会被移除导航控制器的栈,但是不会立即销毁,移除栈的控制器会被放入自动释放池,等事件循环结束后如果没有强指针指向它,这时就会被销毁。
Modal
/*
The next two methods are replacements for presentModalViewController:animated and dismissModalViewControllerAnimated: The completion handler, if provided, will be invoked after the presented
controllers viewDidAppear: callback is invoked.
*/
- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion NS_AVAILABLE_IOS(5_0);
// 关闭当初Modal出来的控制器
- (void)dismissViewControllerAnimated: (BOOL)flag completion: (void (^)(void))completion NS_AVAILABLE_IOS(5_0);
- modal方法跳转控制器只是把目标控制器的View加到了现有控制器上,添加后的View依旧需要目标来管理,而且源控制也不会随新Modal来得View而移除销毁。Modal一般适用于两个不相关的控制器切换(Modal的效果是从屏幕底部向上覆盖源控制器的View)
storyboard中通过segue跳转
自动型:点击某个控件(比如按钮)的时候自动跳转到下一个控制器(按住Control键,直接从控件拖线到目标控制器,适用于不需要做任何判断的跳转)
手动型:需要通过写代码手动执行Segue(必须由来源控制器执行Segue),才能完成界面跳转(按住Control键,从来源控制器拖线到目标控制器,适用于需要做一些判断后再跳转的情况,比如登录的时候判断账号密码)
// 跳转前做的一些准备工作 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender NS_AVAILABLE_IOS(5_0); // 用来源控制器手动执行此方法 - (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender NS_AVAILABLE_IOS(5_0);
- 如果segue的style是push
- 取得sourceViewController所在的UINavigationController
- 调用UINavigationController的push方法将destinationViewController压入栈中,完成跳转
如果segue的style是modal
- 调用sourceViewController的presentViewController方法将destinationViewController展示出来
Storyboard上每一根用来界面跳转的线,都是一个UIStoryboardSegue对象(简称Segue)