【问题标题】:viewDidLoad method is calling again after setting nil to tableView in UITableViewController in iOS在 iOS 的 UITableViewController 中将 nil 设置为 tableView 后再次调用 viewDidLoad 方法
【发布时间】:2013-08-09 17:32:54
【问题描述】:

我在我的应用程序中使用 UITableViewController。当从 tableview 控制器弹出到 back 时,我将 nil 设置为 table view 以从内存中释放视图控制器。它再次调用 viewDidLoad,请解释一下为什么会这样。

-(void)handleBackButton{
        self.tableView=nil;
        [self.navigationController popViewControllerAnimated:YES];
}

【问题讨论】:

  • 什么?给我们看一些代码
  • 我正在覆盖 UINavigationController 的后退按钮事件,并在该方法中设置 self.tableView=nil。那时它正在发生。
  • 没有代码很难帮助你。一件事:当你设置 self.tableView=nil 时,你释放的是表视图,而不是表视图控制器。
  • 无需将表格视图设置为 nil。当你从堆栈中弹出表视图控制器时,它和它的视图将被释放。
  • 请找到我更新的编辑。抱歉我的打字错误。

标签: iphone ios objective-c xcode ios6


【解决方案1】:

您可以在viewDidLoad 中设置断点并查看堆栈跟踪以了解它为什么要重新加载其视图。

但我可以做出有根据的猜测。当您告诉导航控制器弹出一个视图控制器时,它需要将该视图控制器的view 动画化离开屏幕。为此,它可能会向消失的视图控制器询问其view。

UITableViewController 的view 与其tableView 相同。当您将tableView 设置为nil 时,您也将view 设置为nil。因此,当导航控制器向表格视图控制器询问其view 时(因此它可以使视图离开屏幕),表格视图控制器注意到其view 为nil,因此它加载其视图。为了加载它的视图,它先发送自己loadView,然后发送自己viewDidLoad。

我不知道您为什么真的会费心尝试卸载视图。如果视图控制器本身被释放,它将释放它的视图(这将释放视图,除非你将它保留在其他地方)。如果视图控制器没有被释放,那通常不是因为您可能希望尽快将其视图放回屏幕上吗?

无论如何,如果您真的想摆脱视图控制器的视图,请不要将其 view 设置为 nil,而该视图可能仍在屏幕视图层次结构中。等到视图绝对超出层次结构。例如,子类UITableViewController,并像这样覆盖didMoveToParentViewController::

- (void)didMoveToParentViewController:(UIViewController *)parentViewController {
    [super didMoveToParentViewController:parentViewController];
    if (parentViewController == nil) {
        self.tableView = nil;
    }
}

【讨论】:

  • 感谢您的解释。你的猜测是正确的,这里发生的事情完全一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-09
  • 2011-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多