弹出到根视图控制器,表视图不会发生动画崩溃

2024-02-14

我在标签栏控制器中有 3 个视图控制器。单击任何选项卡都会在导航堆栈中加载其根视图控制器。

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

[用户详情VC 表视图:cellForRowAtIndexPath:]: 消息发送到已释放的实例 0xe0a23b0

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

#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巧妙地优化了not立即重新加载数据,因为如果它位于隐藏选项卡上,用户无论如何都不会看到它。相反,重新加载请求会被推迟并存储在某处以供视图显示时使用。但在显示之前,您需要将 myTable 从导航堆栈中弹出。当显示 myTable 的原始选项卡时,会执行重新加载请求,但其数据源不再存在,因此这是一个错误的访问。

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

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

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

任何额外的智慧都将受到欢迎。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

弹出到根视图控制器,表视图不会发生动画崩溃 的相关文章

随机推荐

  • 安装 Tidy、PHP

    我猜当 php 安装在我的盒子上时 没有包含 with tidy arg 当浏览我的 php ini 时 该行 extension php tidy dll 不见了 如何将模块添加到我的 php 安装中 注意我尝试添加 extension
  • Vaadin 网格行高

    我想减小单元格大小 以便在屏幕上容纳更多行 屏幕 1 到目前为止我已经用过 v grid cell font size 13px height 18px vertical align middle v grid row height 18p
  • android - 在两个网络视图之间共享会话?

    首先 有人可以解释一下怎么做吗CookieManager getInstance 工作 我真的不明白如何从 webview 获取会话 假设我有这个 CookieSyncManager createInstance WebviewPage t
  • 全局和本地 python 安装,以及意外在 virtualenv 之外运行需求文件

    所以我在谷歌上搜索了一个 pip 需要 sudo 权限的事件 我遇到了以下两个线程运行 sudo pip 有哪些风险 https stackoverflow com questions 21055859 what are the risks
  • 通过文本和文件流保存 openpyxl 文件

    我正在将 OpenPyXL 构建到一个应用程序中 该应用程序需要一个包含 excel 文件内容的字符串 以便通过文件流写入 根据我对 OpenPyXL 源代码的调查 它看起来并不支持这种输出 有谁有修改 openpyxl 以支持这一点的经验
  • 如何检查特定的子解析器?

    如何检查特定的子解析器 import argparse if name main mainparser argparse ArgumentParser submainadder mainparser add subparsers title
  • Javascript:根据其内容选择选项

    基本上是这样 但是在纯 JavaScript 中 如何使用 Nokogiri 根据选择标签的内容获取选择标签的 值 https stackoverflow com questions 2346257 how to get value of
  • 判断 NSNumber 是否为 NaN

    如何判断可可是否NSNumber表示 NaN 不是一个数字 例如 当我解析具有无效 非数字 内容的字符串时 就会出现这种情况 所以 我发现类属性 NSDecimalNumber notANumber 就是为了这个目的 在某些语言中 NaN
  • 按 ID DESC 排序

    我试图让博客页面按降序给出的自动递增唯一 ID 对其条目进行排序 但它似乎不允许这样做 尽管 SQL 请求如下所示 但它始终按升序显示 SELECT FROM news blog ORDER BY news id DESC 是不是因为新闻i
  • 我可以配置 NLog 在日志达到一定限制后修剪日志吗?

    NLog 可以配置为在日志文件达到一定文件大小后自动修剪 修剪日志文件吗 我认为您最接近的目标是使用archiveAboveSize属性让 NLog 在日志文件达到一定大小时对其进行归档 通过将其与maxArchiveFiles属性 您可以
  • 请解释一下Labeled statements的用法

    Java 中标记语句的唯一用途是中断和继续吗 您什么时候在程序中使用过标签语句 抱歉 代码片段已被删除 我正在拆分问题 JLS 14 7 标签语句 https docs oracle com javase specs jls se14 ht
  • ASP.NET MVC 自定义 ModelMetadataProvider 和 ModelValidatorProvider

    在我的 ASP NET MVC 应用程序中 我在数据库中定义了基于元数据的模型 我有一个定义数据元数据的自定义对象 并使用数据集进行 DTO 为了显示这一点 我计划编写一个自定义 ModelMetadataProvider 和 ModelV
  • 在 PyCUDA 中迭代二维数组

    我试图在 PyCUDA 中迭代一个 2D 数组 但最终得到了重复的数组值 我最初抛出一个小的随机整数数组 它按预期工作 但是当我向它抛出图像时 我一遍又一遍地看到相同的值 这是我的代码 img np random randint 20 si
  • 为什么这个查询使用where而不是索引?

    EXPLAIN EXTENDED SELECT board FROM board WHERE board category id 5 AND board board id 0 AND board display 1 ORDER BY boa
  • 应用 Angular2 ngModel 后格式化输入值

    我正在尝试创建一个指令 将输入值格式化为货币格式 我能够在焦点和模糊上做我必须做的事情 并且在 ngOnInit 钩子 和任何其他钩子 中 输入元素尚未应用任何值 如何 监视 输入的值 并在应用初始值时对其进行格式化 这是我的指令 impo
  • CloudFormation:模板 RDS Mysql 以创建数据库、表、用户或加载架构

    我正在尝试使用 CloudFormation 找出一些用例 第一种情况是拥有现有的 AWS RDS MySQL 服务器 如何通过 CloudFormation 模板创建数据库 表和用户帐户 在查看了 Cloudformation 文档之后
  • VB.NET 中的 GoTo 语句和替代语句

    我在另一个论坛上发布了一个代码片段寻求帮助 人们向我指出使用GoTo语句是非常糟糕的编程习惯 我想知道 为什么会不好呢 有什么替代方案GoTo在 VB NET 中是否可以使用通常被认为是更好的实践 考虑下面的这个片段 用户必须输入他们的出生
  • Pylab - “模块”对象没有属性“图”

    我正在尝试使用 Tkinter 创建视图 因此我也使用 pylab 我的问题是我收到一条错误消息 属性错误 模块 对象没有属性 图 错误来自这行代码 self fig FigureCanvasTkAgg pylab figure maste
  • 加载 hazelcast 的所有实现

    我正在尝试在多个节点上使用 hazelcast 服务器 我已经在地图存储实现中实现了全部加载 我想知道这是否应该只在服务器节点上启用还是在所有节点上启用 如果我在所有节点上部署相同的内容 这是否不会创建不需要的数据库读取操作 如果我需要仅在
  • 弹出到根视图控制器,表视图不会发生动画崩溃

    我在标签栏控制器中有 3 个视图控制器 单击任何选项卡都会在导航堆栈中加载其根视图控制器 例如选项卡 1 选项卡 2 和选项卡 3 导航堆栈中的第二个视图控制器 tab2VC2 有一个 tableView 单击 tab2 在 tab2 中显