我有一个用XIB初始化的iPhone视图控制器。如何在内存警告吹出后从XIB重新加载UIViewController的视图?
如果视图控制器的视图在内存警告通过时不可见,它将其视图设置为零(释放它)。但是,当一个重叠的视图被解散并且被清除的视图再次可见时,Cocoa不会从XIB重新加载;它只是创建一个空白的。这留下了一个空白的白色屏幕和一个破碎的应用程序。
苹果文档的UIViewController的的loadView法说,“如果视图控制器都有一个相关的笔尖文件,此方法加载从笔尖文件的视图。视图控制器有一个相关的笔尖文件,如果nibName属性返回非零价值“。所以我超越loadView只是为了检查nibName初始化控制器后,nibName是正确的。所以随后调用loadView应该从XIB重新加载。我确认loadView在内存警告后再次被调用。
UPDATE:随着越来越多的测试和记录,我已经确定了第二viewDidLoad中电话后,该视图的IBOutlets是不为零。由于我将它们设置为零,因此我认为该视图确实是从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'? – Costique 2012-02-29 04:55:12
是的。问题是如何重新加载。 – Oscar 2012-02-29 05:05:07
如果你做得对,视图会自动重新加载。当控制器即将出现时,它会检测到它的视图已经被卸载,并发送自己'loadView'。请向我们展示'loadView','viewDidLoad'和'viewDidUnload'中的代码。 – Costique 2012-02-29 05:10:26