iOS
中提供了经典弹框供开发者使用,但是每个公司为了展现出自身的优势,会制作各种酷(sha)炫(diao)的弹框,网上也有其他各种各样的实现。当然,也有使用控制器来实现的方案。下面说下使用此方案遇到的问题。
使用控制器实现的话,就会有个操作,将控制器当做子控制器添加到父控制器上。如果父控制器是个导航控制器,可能就会遇到弹框显示无法退出的情况。具体步骤如下:
- 父控制器为导航控制器,并且导航控制器已经有了至少两个子控制器。
- 展示弹框,这个时候弹框控制器至少是父控制器的第三个子控制器。
- 调用导航控制器的出栈操作,至少保证此步骤之后弹框控制器已经不在导航控制器的控制下。
这个时候,你一定会发现弹框还会存在,但是点击任何地方没有了反应,弹框无法退出。
原因就是此时弹框控制器的父控制器不存在了,但是view
还在呈现。失去了管理,就无法操作了。
解决方法就是重写UIViewController
的- (void)willMoveToParentViewController:(UIViewController *)parent
方法,并添加如下代码:
- (void)willMoveToParentViewController:(UIViewController *)parent
{
if (parent == nil) {
[self dismiss];
return;
}
[super willMoveToParentViewController:parent];
}
这里就是针对父控制器为nil
时,弹框退出。这样就不会在出现上面的Bug
了。