【发布时间】:2012-03-18 14:54:11
【问题描述】:
我有一个用 XIB 初始化的 iPhone 视图控制器。
如果出现内存警告时视图控制器的视图不可见,则它将其视图设置为 nil(释放它)。但是当一个重叠的视图被解除并且被清除的视图再次变得可见时,Cocoa 不会从 XIB 重新加载它;它只是创建一个空白。这会留下一个空白屏幕和一个损坏的应用程序。
UIViewController 的 loadView 方法的 Apple 文档说:“如果视图控制器具有关联的 nib 文件,则此方法会从 nib 文件加载视图。如果视图控制器具有关联的 nib 文件,则nibName 属性返回一个非零值。”所以我重写 loadView 只是为了在初始化控制器后检查 nibName ,并且 nibName 是正确的。因此对 loadView 的后续调用应该从 XIB 重新加载。我验证了在内存警告之后再次调用了 loadView。
更新:通过更多的测试和记录,我确定在第二次 viewDidLoad 调用之后,视图的 IBOutlets 不为零。由于我在 viewDidUnload 中将它们设置为 nil,因此我得出结论认为视图确实是从 XIB 重新加载的。那么为什么会显示为全白屏呢?
感谢您的任何见解。
这里是 viewDidLoad:
- (void)viewDidLoad
{
[super viewDidLoad];
_photoViewController = [[EGOSimplePhotoViewController alloc] initWithPhotoSource:_photoSource
scrollView:bigImageScrollView
enclosingView:photoSquare];
_photoViewController.delegate = self;
if(_progressHUD == nil)
{
if(self.navigationController.view != nil)
{
_progressHUD = [[MBProgressHUD alloc] initWithView:self.navigationController.view];
}
else
{
_progressHUD = [[MBProgressHUD alloc] initWithView:self.view];
}
}
// Add HUD to screen.
if(self.navigationController.view != nil)
{
[self.navigationController.view addSubview:_progressHUD];
}
else
{
[self.view addSubview:_progressHUD];
}
[_progressHUD release];
_progressHUD.labelText = @"Loading...";
[_progressHUD show:YES];
}
以及viewDidUnload:
- (void)viewDidUnload
{
[_photoViewController release];
[super viewDidUnload];
}
【问题讨论】:
-
你实现
viewDidUnload了吗? -
是的。问题是如何重新加载。
-
如果操作正确,视图会自动重新加载。当控制器即将出现时,它检测到它的视图已被卸载,并发送给自己
loadView。请向我们展示loadView、viewDidLoad和viewDidUnload中的代码。 -
您是否尝试将
[super viewDidUnload]放入您的viewDidUnload中?您是否覆盖了loadView?如果系统之前曾向您发送过viewDidUnload,则系统绝对应该向您发送loadView(然后是viewDidLoad)。 -
这个问题开始时我什至没有 viewDidUnload,所以这不是问题(虽然很好)。系统正在向我发送 loadView。它只是第二次没有从 XIB 加载。
标签: iphone ios memory-management uiviewcontroller xib