为什么iOS不会在由didReceiveMemoryWarning发布之后自动从Nib加载的视图?

时间:2011-01-11 07:45:51

标签: ios uiviewcontroller autorotate didreceivememorywarning

My iPad app大量使用自转。这很棒。但是,我注意到如果didReceiveMemoryWarning的默认实现(如here所述)发布隐藏视图,则从笔尖重新加载视图时我恰好在景观中,它以纵向加载它。这会对界面造成严重破坏,直到我手动旋转iPad并强制它进入正确的方向。

我原以为iOS会在当前方向加载视图;这就是应用程序启动时的功能。但它没有,不是在被didReceiveMemoryWarning卸载之后。为什么不?我怎么能这样做呢?

2 个答案:

答案 0 :(得分:4)

由于来自dbarker的指针,确定的答案是视图控制器的旋转方法,包括-willRotateToInterfaceOrientation:duration:-willAnimateRotationToInterfaceOrientation:duration:,在视图重新加载之后将不会被调用didReceiveMemoryWarning的默认实现已卸载视图。我不知道为什么它会在应用程序启动时有所不同,但我确实有一个解决方法

我所做的是在unloadedByMemoryWarning中设置名为YES的布尔值,didReceiveMemoryWarning,如下所示:

- (void) didReceiveMemoryWarning {
    unloadedByMemoryWarning = YES;
    [super didReceiveMemoryWarning];
}

然后,在viewDidLoad中,如果该标志为真,我将其设置为NO,然后自己调用旋转方法:

if (unloadedByMemoryWarning) {
    unloadedByMemoryWarning = NO;
    [self willRotateToInterfaceOrientation:self.interfaceOrientation duration:0];
    [self willAnimateRotationToInterfaceOrientation:self.interfaceOrientation duration:0];
    [self didRotateFromInterfaceOrientation:self.interfaceOrientation];
}

有点糟透了我必须这样做,但它确实有效,现在我不太担心因使用太多内存而被iOS杀死。

答案 1 :(得分:1)

  1. 我认为iOS 5可能会解决此问题。

  2. 对于iOS 4.3,我在另一个修复方面运气不错。从nib加载后:

    [parent.view addSubview:nibView];  
    nibView.frame = parent.view.frame;  
    [nibView setNeedsLayout];  
    

    如果有效,你可以放弃unloadedByMemoryWarning逻辑,因为每次加载都是安全的。得到了提示&代码(基本上)来自here