ios - 弹出到 Root View Controller , TableView 没有动画崩溃

标签 ios objective-c uinavigationcontroller uikit

我在标签栏 Controller 中有 3 个 View Controller 。单击任何选项卡都会在导航堆栈中加载其 Root View Controller 。

例如选项卡 1、选项卡 2 和选项卡 3。
导航堆栈 (tab2VC2) 中的第二个 View Controller 有一个 tableView。 点击 tab2 在 tab2 中显示 VC,然后点击 tab1,尝试转到它的 rootVC。然后应用程序崩溃说

[UserDetailVC tableView:cellForRowAtIndexPath:]: message sent to deallocated instance 0xe0a23b0

如果我用动画 popToRootVC 就没问题。我发现tab2VC2中的viewDidAppear在调用tableView.reloadData的地方被调用,然后dealloac,似乎同时reloadData开始工作,表被释放。在动画的情况下,它需要一些时间,所以它不会崩溃。但是如果没有动画,它就会崩溃。 你认为这是 iPhone 的 bug 吗?还是我做错了?由于弹出到根 Controller 有一个没有动画的选项,它应该可以工作,不是吗?

#pragma mark Tab bar controller delegate
- (void)tabBarController:(UITabBarController *)tbController didSelectViewController:(UIViewController *)viewController {
    int i = tbController.selectedIndex;
    NSArray *mycontrollers = tbController.viewControllers;
    [[mycontrollers objectAtIndex:i] popToRootViewControllerAnimated:NO];
}

最佳答案

我认为这是 UIKit 中的一个错误或至少是一个弱点,但我已经花了半天时间研究它,所以我现在不打算用示例代码编写它并立即向 Apple 报告。如果有人想这样做,我将不胜感激。

这是我认为幕后发生的事情。您有一个 UITableViewController,我们称它为 myTable,位于 UINavigationController 的堆栈上,并且该导航堆栈是隐藏的,因为它位于未选择的选项卡或其他任何内容上。然后,您调用 [myTable.tableView reloadData],iOS 通过立即重新加载数据来巧妙地优化,因为如果它位于隐藏选项卡上,用户无论如何都看不到它。相反,重新加载请求被推迟并存储在某个地方,以便在显示 View 时使用。但在显示之前,您将 myTable 从导航堆栈中弹出。当显示 myTable 的原始选项卡时,重新加载请求被执行,但它的数据源不再存在,因此这是一个错误的访问。

现在,根据我对使用自动提供的 tableView 属性(不是从 NIB 文件加载)的 UITableViewController 的子类进行的测试,当 myTable 像上面的情况一样解除分配时,UITableView 没有被解除分配。这很好,除了 UITableViewController 的默认 dealloc 实现不会清除 UITableView 的 dataSource 属性(这是由 init 的默认实现设置的)。

因此,可能有一些很好的解决方法,比如自己推迟 reloadData 的请求,但我能想到的最简单的方法是将其放在 UITableViewController 子类的实现中:

- (void)dealloc {
  ...
  self.tableView.delegate = nil;
  self.tableView.dataSource = nil;
  [super dealloc];
}

欢迎任何额外的智慧。

关于ios - 弹出到 Root View Controller , TableView 没有动画崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5499913/

相关文章:

iphone - ^(void)完成标记的用途

iOS:使用 performSelectorInBackground 发送同步请求

ios - NSDateFormatter - 添加一年?

ios - UIViewControllerContextTransitioning 和 UINavigationControllerDelegate

ios - 获取导航栏的默认返回指示器图像

ios - PhoneGap 1.5(Cordova)+ ChildBrowser白名单问题

ios - SceneKit——平移手势移动节点太快

objective-c - 在 View Controller 之间拖放(包含在同一 View Controller 中)

ios - 创建一个静态 TableView ,在一个单元格中有一个分段控件,在另一个单元格中有 3 个 View ,我如何将分段连接到我的 View

ios - 如何在导航栏内添加带有范围栏的搜索栏,其中导航栏自动增加其高度并显示空格栏