2011-03-16 44 views
3

这使我疯狂。我正在使用three20的TTTableViewController,当我收到内存警告时,屏幕变白。现在,看完三大20谷歌组似乎是tableView得到释放。但是,我不能为了我的生活找出一个支票,看看是否是这种情况,然后重新创建它。three20 - TTTableViewController内存警告给出黑屏,如何解决?

我所用,因为我认为这将解决该问题下面,但它似乎不满足if语句:

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 

    // If we don't have a datasource we need to reset it 
    if (!self.dataSource) { 
     // Create datasource again 
    } 

}//end 

有谁知道做什么的时候出现这种情况?谷歌集团一直没有帮助。

回答

0

您是否继承了TTTableViewController?我以前没有用过,但假设它就像UITableViewController ...

你的“viewDidUnload”是怎么样的?你在这里发布tableview吗?如果是这样,你需要在viewDidLoad中创建tableview来匹配它。

不需要检查viewDidAppear中的dataSource是否可用,因为如果您阅读View编程指南,它会解释内存警告将调用“viewDidUnload”,以便您清除在“viewDidLoad”中创建的数据。

+0

不,我不是继承它。在我的viewDidUnload方法中,我什么都没有,所以在三二十的某个地方它正在被释放。 – 2011-03-16 23:57:26

+0

你可以分享代码添加tttbc到你的视图的方法吗? – 2011-03-17 06:16:20

0

我有同样的问题,它也让我疯了。

没有人在three20文档中提到它,但不应该使用UIViewController的initWithNibName函数来添加子视图。如果这样做,内存警告将释放这些子视图。

尝试将代码从initWithNibName函数移至viewDidLoad函数。我注意到一些代码需要保存在initWithNibName中,比如导航样式。但是,添加到控制器视图的任何子视图都应该放在viewDidLoad函数中。

0

一般来说,您应该小心地设置viewDidLoad而不是类构造函数的视图。例如,您应该在viewDidLoad而不是您的启动器视图控制器的构造函数中设置启动器视图,否则在内存警告后您的启动器将变为空。

在TTTableViewController的情况下,但这通常不适用,因为您没有手动设置表视图。我遇到了同样的问题,并最终追查下来:我重新定义了viewWillDisappear:,并忘记了拨打[super viewWillDisappear:animated]。这意味着Three20控制器维护的关于视图状态的一些标志未被正确更新。

我还发现在调用super之前重新定义didReceiveMemoryWarning以致电[self setEditing:NO]是有益的;我发现表格视图的状态会变得很混乱(如果你没有使用表格的编辑模式,这是不相关的)。

最后,在Three20中有一个错误,这意味着在加载/空/错误模式下的表将不会被正确恢复;请参阅blog post by TwoCentStudiosproposed fix on github中的讨论。