您的位置:首页 > 其它

使用模态视图导致pushViewController失效的解决方法

2015-02-25 11:26 633 查看
使用模态视图导致pushViewController失效的解决方法
通常我们用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,应该采取和此前类似的操作。否则直接跳转就可以了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐