使用模态视图导致pushViewController失效的解决方法
2015-02-25 11:26
633 查看
使用模态视图导致pushViewController失效的解决方法
通常我们用pushViewController来将一个新的视图压入栈,由于栈的特性,我们可以不停的将新的视图压入栈中,也就实现了A视图跳转到B视图,B跳转到C这样的功能。
pushViewController的默认动画是从右侧滑出,如果我们想要实现从底部弹出的效果,一种思路是自定义动画,另一种方法就是使用“模态视图”。模态视图默认从底部弹出,使用方法也和普通的视图跳转类似。只要把pushViewController换成presentViewController就可以了。不过要注意的是,在iOS
6.0以后的系统中,
已经换成了
也就是多了一个添加回调函数的机会,如果用不着留空就好。这样就实现了新视图从底部弹出。
然而这样做会导致一个潜在的问题,在这个新的视图里执行页面跳转会失效。这是由模态视图自身的特性决定的,模态视图原意是在程序的运行的过程中开辟一个新的视图,并且只有将这个视图处理完成后才能回到原来试图。这是一条死胡同,进了模态视图就必须原路返回。这也就意味着我们不可能在模态视图中执行页面跳转。
明白了失败原因后,解决方法也就不难找到了。假设我们需要在A视图中跳转B,B再跳转到C。我们可以把B“封装”进一个navigationController。然后从A跳转到这个navigationController。
这样做的目的在于,模态视图变成了这个navigationController,原先的要展示的视图B只不过是navigationController的rootViewController。虽然现在这个navigationController变成了模态视图,不能再弹出来新的视图了,但因为它自身是一个navigationController,所以它的内部还是可以进行视图跳转的,也就是可以从当前展示的视图跳转到新的视图。
通常我们用pushViewController来将一个新的视图压入栈,由于栈的特性,我们可以不停的将新的视图压入栈中,也就实现了A视图跳转到B视图,B跳转到C这样的功能。
pushViewController的默认动画是从右侧滑出,如果我们想要实现从底部弹出的效果,一种思路是自定义动画,另一种方法就是使用“模态视图”。模态视图默认从底部弹出,使用方法也和普通的视图跳转类似。只要把pushViewController换成presentViewController就可以了。不过要注意的是,在iOS
6.0以后的系统中,
<span style="white-space:pre"> </span>presentViewController:B animated:YES;
已经换成了
<span style="white-space:pre"> </span>presentViewController:B animated:YES completion:^(void){};
也就是多了一个添加回调函数的机会,如果用不着留空就好。这样就实现了新视图从底部弹出。
然而这样做会导致一个潜在的问题,在这个新的视图里执行页面跳转会失效。这是由模态视图自身的特性决定的,模态视图原意是在程序的运行的过程中开辟一个新的视图,并且只有将这个视图处理完成后才能回到原来试图。这是一条死胡同,进了模态视图就必须原路返回。这也就意味着我们不可能在模态视图中执行页面跳转。
明白了失败原因后,解决方法也就不难找到了。假设我们需要在A视图中跳转B,B再跳转到C。我们可以把B“封装”进一个navigationController。然后从A跳转到这个navigationController。
<span style="white-space:pre"> </span>UINavigationController *navigation = [[UINavigationController alloc]initWithRootViewController:B];
<span style="white-space:pre"> </span>[self.navigationController presentViewController:navigation animated:YES completion:^(void){}];
这样做的目的在于,模态视图变成了这个navigationController,原先的要展示的视图B只不过是navigationController的rootViewController。虽然现在这个navigationController变成了模态视图,不能再弹出来新的视图了,但因为它自身是一个navigationController,所以它的内部还是可以进行视图跳转的,也就是可以从当前展示的视图跳转到新的视图。
<span style="white-space:pre"> </span>[self.navigationController presentViewController:registerView animated:YES completion:^(void){}];如果C还要跳转到D,应该采取和此前类似的操作。否则直接跳转就可以了。
相关文章推荐
- iOS解决使用模态视图 导致无法pushViewController
- iOS解决使用模态视图 导致无法pushViewController
- pushViewController/presentModalViewController/addSubView区别及使用方法
- 使用通知机制,在dismissViewControllerAnimated后,completion传值给上一个父视图方法
- pushViewController/presentModalViewController/addSubView区别及使用方法
- pushViewController/presentModalViewController/addSubView区别及使用方法
- iOS开发 控件不能绑定拖动到视图ViewController连接的解决方法
- ImageView(图像视图)-解决blackground拉伸导致图片变形的方法
- 如何在present出来的viewController里使用push方法
- CoordinatorLayout中,有水平RecyclerView,导致appbar_scrolling_view_behavior失效的解决方法
- Asp.Net MVC使用ViewData导致双引号被转义的解决方法
- pushViewController/presentModalViewController/addSubView区别及使用方法(搬)
- IOS UISplitViewController之 解决 密码框添加之后 调用子视图的转向方法之时 对象为空
- pushViewController/presentModalViewController/addSubView区别及使用方法
- 使用通知机制,在dismissViewControllerAnimated后,completion传值给上一个父视图方法
- 如何从模态视图push到下一个ViewController
- 使用dismissModalViewControllerAnimated 不调用dealloc 内存不释放解决方法
- 加载tabbar的视图在启动后直接push到下一界面出现navigationbar失效的解决方法
- 因IOS版本导致的模态视图控制器dismissModalViewControllerAnimated调用问题
- sharepoint 2010 列表的数据表视图无法使用 the list cannot be displayed in datasheet view 解决方法