1. 程式人生 > >導航控制器新增子控制器,你遇到問題了嗎?

導航控制器新增子控制器,你遇到問題了嗎?

iOS中提供了經典彈框供開發者使用,但是每個公司為了展現出自身的優勢,會製作各種酷(sha)炫(diao)的彈框,網上也有其他各種各樣的實現。當然,也有使用控制器來實現的方案。下面說下使用此方案遇到的問題。

使用控制器實現的話,就會有個操作,將控制器當做子控制器新增到父控制器上。如果父控制器是個導航控制器,可能就會遇到彈框顯示無法退出的情況。具體步驟如下:

  1. 父控制器為導航控制器,並且導航控制器已經有了至少兩個子控制器。
  2. 展示彈框,這個時候彈框控制器至少是父控制器的第三個子控制器。
  3. 呼叫導航控制器的出棧操作,至少保證此步驟之後彈框控制器已經不在導航控制器的控制下。

這個時候,你一定會發現彈框還會存在,但是點選任何地方沒有了反應,彈框無法退出。

原因就是此時彈框控制器的父控制器不存在了,但是view還在呈現。失去了管理,就無法操作了。

解決方法就是重寫UIViewController- (void)willMoveToParentViewController:(UIViewController *)parent方法,並新增如下程式碼:

- (void)willMoveToParentViewController:(UIViewController *)parent
{
    if (parent == nil) {
        [self dismiss];
        return;
    }
    [super willMoveToParentViewController:parent];
}

這裡就是針對父控制器為nil時,彈框退出。這樣就不會在出現上面的Bug了。