casatwy / CTMediator

The mediator with no regist process to split your iOS Project into multiple project.
Other
3.99k stars 776 forks source link

关于keyWindow的问题 #63

Closed CaiWanFeng closed 4 years ago

CaiWanFeng commented 4 years ago

你好,我发现源码中获取topViewController是基于keyWindow的:

- (UIViewController *)topViewController
{
    UIViewController *topController = [UIApplication sharedApplication].keyWindow.rootViewController;

    while (topController.presentedViewController) {
        topController = topController.presentedViewController;
    }

    return topController;
}

但是keyWindow是变化的,比如说UIAlertView所在的window就是一个临时的keyWindow

考虑如下场景,有一个UIAlertView,点击UIAlertView的按钮跳转到一个新的controller

func alertView(_ alertView: UIAlertView, clickedButtonAt buttonIndex: Int) {
    let vc = CQBaseViewController()
    vc.title = "present"
    vc.view.backgroundColor = .orange
    CTMediator.sharedInstance().present(vc, animated: true) {

    }
}

虽然跳转过去了,但是新的controller随着UIAlertView的消失而消失,因为UIAlertView所在的window就是keyWindow,猜想弹窗消失的时候它的window也释放。

所以是不是delegate.windowkeyWindow更适合?

虽然UIAlertView已经废弃,但是不排除有三方弹窗使用跟他一样的思路。

casatwy commented 4 years ago

你好,这个问题我之前确实也没有考虑到。

不过UIAlertView我并不想在针对它去做支持了,如果你实在需要,可以在你自己的项目中给CTMediator做一个专门的category来解决这个问题。

还是非常感谢你提供的建议,谢谢🙏