iOS - 切换UIWindow

时间:2016-04-29 11:19:49

标签: ios objective-c iphone uiwindow

我用来在我的应用中按内容切换键UIWindow以提供更清洁的流程 - 欢迎窗口=>带有项目列表< =>的主屏幕带有汉堡菜单和东西的物品容器。

示例函数如下:

- (void)updateKeyWindow:(UIWindow *)window withTransition:(WindowTransition)transition
{
    UIWindow *originalWindow = _keyWindow;
    _keyWindow = window;

    window.alpha = 0;
    [originalWindow resignKeyWindow];
    [originalWindow resignFirstResponder];
    originalWindow.userInteractionEnabled = NO;
    [window makeKeyAndVisible];
    window.transform = (transition == WindowTransitionFlyDown) ? CGAffineTransformMakeScale(1.02, 1.02) :
                       (transition == WindowTransitionFlyUp)   ? CGAffineTransformMakeScale(.96, .96) :
                                                                 CGAffineTransformIdentity;

//  [UIView animateWithDuration:.24 animations:^{

        window.alpha = 1;
        originalWindow.alpha = 0;
        window.transform = CGAffineTransformIdentity;
        originalWindow.transform = (transition == WindowTransitionFlyDown) ? CGAffineTransformMakeScale(.96, .96) :
                                   (transition == WindowTransitionFlyUp)   ? CGAffineTransformMakeScale(1.02, 1.02) :
                                                                             CGAffineTransformIdentity;

//  } completion:^(BOOL b){

        [originalWindow resignFirstResponder];
        [originalWindow removeFromSuperview];
        [originalWindow.rootViewController.view removeFromSuperview];
        originalWindow.rootViewController = nil;
        originalWindow = nil;

//  }];
}

我使用动画来提供漂亮的过渡,但我已经评论过它以测试它是否不是我所遇到的问题的原因。

问题是,从层次结构中删除originalWindow并退出阻止/功能后,UIWindow 未被释放并挂起某处在太空中。我已经通过将断点放在重载的-dealloc内来测试这个子类。

我已经检查了UIApplication的{​​{1}}和-keyWindow的{​​{1}},两者都分配了新的AppDelegate个对象。

但是,在屏幕上点按任意位置后,调用堆栈中的某些-window内容会触发前一个UIWindow的{​​{1}}。

Call stack after tapping inside new UIWindow triggering dealloc of old UIWindow

我发现这种行为非常奇怪,-dealloc中一定有问题,我并不认为这种做法会对我有什么不妥。

2 个答案:

答案 0 :(得分:-1)

请参阅the resignKeyWindow documentation

  

永远不要直接调用此方法。系统调用此方法并发布UIWindowDidResignKeyNotification以让窗口知道它何时不再是键...

尝试删除它并查看它是否修复了崩溃。

答案 1 :(得分:-1)

问题是 UIApplication 的 keyWindow 根据定义很弱。所以你应该把你的 UIWindow 强烈地连接到某个对象上;比如 ApplicationDelegate 或一些单例。