loc*_*ope 8 view objective-c superview ios
我有一个从选项卡式应用程序模板创建的应用程序.(ARC,iOS 4)
问题
现在,当ModalViewCont在屏幕上,按Home键将应用程序放在后台并在获得应用程序后,关闭ModalViewCont不会带回ViewCont2的视图,而是带有底部标签栏的黑屏.没有放置应用程序背景/前景就会发生同样的事情; 如果在点击2.制表符之前点击其他选项卡.(编辑:只有在viewWillDisappear中将self.view设置为nil而不是viewDidDisappear时才会发生这种情况.)
我确定ViewCont2加载一个新视图(检查它的引用)但是视图的superview是nil所以新视图不会显示而是显示黑屏.
事情没有用
我考虑的解决方案
_
if (self.view.superview == nil)
{
self.tabBarController.selectedViewController = nil;
self.tabBarController.selectedViewController = self;
}
Run Code Online (Sandbox Code Playgroud)
问题
编辑:似乎早于它应该调用viewDidLoad时(即在viewWillDisappear而不是viewDidDisappear中查看视图时),不设置superview.
这看起来很奇怪,但你的建议(1)确实是解决这个问题的正确方法:
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
if (!self.view.superview) { // check if view has been added to view hierarchy
self.tabBarController.selectedViewController = nil;
self.tabBarController.selectedViewController = self;
}
}
Run Code Online (Sandbox Code Playgroud)
你的第二个建议是有利于性能(因为视图加载是一项昂贵的操作) - 但它不能解决问题.在以下情况下,您也可以使用黑屏而不将视图设置为nil(在iOS模拟器中测试):
通常,您可以假设在viewDidLoad中设置了view属性,并且在viewWillAppear + viewDidAppear中,视图已添加到视图层次结构中; 所以superview应该在那时(这里superview是类UIViewControllerWrapperView的tabbarcontroller的私有视图).但是在我们的情况下,虽然重新加载视图(在应用程序恢复时),但它不会添加到视图层次结构中,从而导致黑屏.这似乎是UITabBarController中的一个错误.
解决方法强制再次执行外观选择器.因此,将再次调用viewWillAppear,这次使用superview.viewDidAppear也会被调用两次!
将self.view设置为nil是可以的,但在大多数情况下不应该是必需的.让系统决定何时卸载视图(iOS可以在内存变低时卸载视图).应该以某种方式设计视图控制器代码,以便可以随时重新配置UI而无需重新加载视图.
归档时间: |
|
查看次数: |
3992 次 |
最近记录: |