我用来在我的应用中按内容切换键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}}。
我发现这种行为非常奇怪,-dealloc
中一定有问题,我并不认为这种做法会对我有什么不妥。
答案 0 :(得分:-1)
请参阅the resignKeyWindow
documentation:
永远不要直接调用此方法。系统调用此方法并发布UIWindowDidResignKeyNotification以让窗口知道它何时不再是键...
尝试删除它并查看它是否修复了崩溃。
答案 1 :(得分:-1)
问题是 UIApplication 的 keyWindow 根据定义很弱。所以你应该把你的 UIWindow 强烈地连接到某个对象上;比如 ApplicationDelegate 或一些单例。