我正在重新创建某种特定于我的应用的UIAlertView
,因此我将UIWindow
作为子类来完成它。窗口将添加到[UIApplication sharedApplication].windows
,但实际上从未显示过。我把它修剪成这段小代码:
UIWindow *testWindow = [[UIWindow alloc] initWithFrame:self.view.bounds];
testWindow.backgroundColor = [UIColor blueColor];
[testWindow makeKeyAndVisible];
当我记录[UIApplication sharedApplication].windows
时,我看到:
"<UIWindow: 0x83774f0; frame = (0 0; 320 480); opaque = NO; autoresize = RM+BM; layer = <UIWindowLayer: 0x8377660>>",
"<UIWindow: 0x8382630; frame = (0 0; 300 400); layer = <UIWindowLayer: 0xf573e60>>"
然而,那个蓝色背景色的第二个窗口现在无处可见。
更新:只有在启用ARC时,这似乎才是问题。我创建了2个新的“单视图”项目,一个启用了ARC,另一个启用了ARC。两者都是相同的,我将UIWindow代码添加到主视图控制器的viewDidAppear:
。当我在模拟器中运行应用程序时,蓝色窗口仅显示在禁用ARC的项目中。看起来ARC过快地摆脱了我的UIWindow,所以它甚至没有时间出现。使其__strong
没有帮助。还是一无所知......
答案 0 :(得分:11)
看起来ARC过快地摆脱了我的UIWindow,所以它甚至没有时间出现。使其
__strong
没有帮助。
制作__strong
的内容?您在问题中显示的变量似乎是一个局部变量,该变量仅在方法返回之前存在。当方法返回时,变量消失,因此没有任何东西拥有窗口,因此它将被释放。
将窗口的指针指向__strong
实例变量或strong
属性。那么你将拥有更持久的所有权,让窗户保持活力。关闭窗口后,将ivar或属性设置为nil
。
作为旁注,你确定你想要它是UIWindow的子类而不是UIView吗?甚至UIAlertView也是一个视图,而不是一个窗口。如果它创建了自己的窗口,您可能希望这样做 - 让视图创建自己的窗口作为实现细节。
答案 1 :(得分:0)
UIScreen
来确定界限:[[UIScreen mainScreen] bounds]
UIView
。opaque = NO
- 尝试[window setOpaque:NO];
或类似的东西。我测试了你的代码并得到了:
应用程序窗口应在应用程序启动结束时具有根视图控制器
基本上,使用[window setRootViewController:...];
。不要问我原因,这对我来说真的不需要。