2012-02-29 67 views
2

我有一个用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]; 
} 
+1

您是否实现了'viewDidUnload'? – Costique 2012-02-29 04:55:12

+0

是的。问题是如何重新加载。 – Oscar 2012-02-29 05:05:07

+2

如果你做得对,视图会自动重新加载。当控制器即将出现时,它会检测到它的视图已经被卸载,并发送自己'loadView'。请向我们展示'loadView','viewDidLoad'和'viewDidUnload'中的代码。 – Costique 2012-02-29 05:10:26

回答

1

的viewControllers查看加载机制内存警告应该是透明的,开发商后。你不应该做一些事情来重新创建视图。

对于使用nib加载的VC,系统将重新创建视图并将调用viewDidLoad。 对于以编程方式加载的VC,loadView将被再次调用。

整个循环重复,直到viewDidAppear:你又看到了视图。

使用案例:

的UITabBarController(2个翼片假定)

用户对选项卡0 >>转到标签1 >>触发存储器警告>>上的UITabBarController所有活跃的VC接收存储器警告>>的UITabBarController将卸载视图Tab0 >> Tab0收到viewDidUnload:

当用户切换回Tab 0时,它的视图将从头开始从loadView或viewDidLoad开始创建,正如我所说的。

如果你没有收到这些事件,那么你的viewController层次结构就会混乱。也许你只是添加了一些VC视图作为子视图的东西或者也许你的VC没有直接或通过一些容器控制器(UINavigation,UITabBarController等)连接到窗口或者你试图卷起你自己的containerController并搞砸了。

尝试了解从loadView到viewDidUnload和dealloc的UIViewController生命周期。这很棒。这将有助于编写好的代码和设计你的应用程序。

+0

谢谢。我已经阅读了文档,而且我没有滚动我自己的控制器层次结构。这是一个非常简单的场景:视图控制器调用照片选择器,这往往会产生内存警告。当选取器被解散时,底层控制器的视图已经被释放并且被重新创建为白色屏幕。我忽略了控制器的loadView方法,并验证了当重叠视图被解除时它确实被调用。它只是不重新加载XIB(是的,它是用一个初始化)。 – Oscar 2012-02-29 05:56:21

+0

@Oscar您是否找到解决方案? – Adriana 2012-11-19 17:42:58

+0

@Adriana:如果您的视图是由XIB创建的,您可以使用nibname方法重新加载视图,但是如果它是在没有Xib的情况下创建的,那么只需在-loadView方法中提供视图创建代码并重新创建视图,以获取任何帮助帮助ping我!!! – 2012-12-11 09:03:48

相关问题