我在MonoTouch中通过将UITableViewControllerUITableViewSource(不是UITableViewDataSource !!!)子类化来绘制表格视图。在视图控制器的构造函数中,我像这样设置表视图源:

TableView.Source = new CustomTableViewSource();

CustomTableViewSource中,我正在构造表格视图的单元格。除了在iPhone模拟器中模拟内存警告时,它的工作效果非常好。如果视图是隐藏的(例如,选择了选项卡栏中的另一个视图控制器),那么当我回来时,表视图只是空白(白色背景,不再有表视图)。

但是,我在DidReceiveMemoryWarning回调中什么也不做。我还尝试再次在TableViewSource中设置viewWillAppear(如果收到内存警告),但没有成功...

这是垃圾收集器问题吗?我知道收到内存警告时会调用GC.Collect。也许垃圾收集器只是丢掉了我的视图,而我需要再次完全显示它?

最佳答案

您应该在ViewDidLoad方法而不是构造函数中初始化表源。加载视图控制器后,每次在出现内存警告后需要重新创建控制器的视图时,都会调用该方法。

我已经进行了一些测试,并在出现内存警告后得到了相似的结果。但是,我只能得到一个空的表视图。当我再次在ViewWillAppear中设置表源时,表中通常会填充数据。

您在ViewWillAppear中的实现不起作用的事实使我认为该方法甚至都不会被调用。如果真是这样,我想您的表视图没有在需要时重新创建。

在某些情况下,如果使用的控制器不是从XIB文件创建的,则可能会发生这种情况。在这种情况下,您应该在LoadView方法中创建视图(不调用base.LoadView()):

public override void LoadView()
{
    this.View = new UITableView(UIScreen.MainScreen.ApplicationFrame); //or something similar
}

我遇到了类似的问题(未重新创建表视图),其中包含导航控制器,包含视图控制器等的选项卡控制器的复杂层次结构。当我提供LoadView方法时,这些问题得以解决。

我猜不透;)

关于c# - 收到内存警告后,UITableViewController为空,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9913206/

10-11 04:27