【问题标题】:Weird behaviour with rootViewController while attempting to set it尝试设置它时 rootViewController 的奇怪行为
【发布时间】:2020-02-10 16:01:09
【问题描述】:

我在导航控制器顶部有一个模态视图。

我希望销毁整个堆栈并重新创建一个新堆栈(重新加载)。

但是,当将新的分配给 window.rootViewController 时,运行时会出现警告,并且视图控制器不会被释放。

为了让事情变得更复杂,我会在重新加载时“自动”导航到模态视图控制器,并且

我附上了一个reprex,它演示了将出现的问题。例如。如果按原样运行,在 iOS 13 上,您会看到计数器从 1 跳转到 3,而在 iOS 12 上,它从 1 跳转到 2。两者都在泄漏内存(部分或全部视图控制器没有被卸载)。

【问题讨论】:

  • 尝试创建一个minimal reproducible example。在不知道自己在做什么的情况下很难尝试提供帮助。
  • @DonMag 我在 GitHub 上添加了可以重现我的问题的示例项目。请参考 RVCtriggerVC。
  • 我也重写了这个问题,以便更简单明了地理解。
  • 好吧 - 很混乱,因为你有一个 TriggerVCRVCTriggerVC 类),但你的 RVCNavRootVC 有一个情节提要 ID "triggerVC"。你的目标是什么?您想从“第一屏”作为 NavVC 根目录开始,按一下按钮到“第二个屏幕”,按一下按钮呈现“第三个屏幕”,然后按一下按钮应该是什么?将所有内容替换为“第三屏”作为 NavVC 根?还是回到原点?
  • 我对 Storyboard ID 的命名错误,但这是正确的。从作为 NavVC 根目录的“第一个屏幕”开始,点击按钮进入“第二个屏幕”,点击“第三个屏幕”。 “第三屏幕”中的按钮点击将替换所有内容,并重复,这一次是自动的:“第一屏幕”作为 NavVC 根,自动推送“第二屏幕”,自动呈现“第三屏幕”。此时应该释放之前的“链”。

标签: ios swift cocoa-touch


【解决方案1】:

主要问题是,无论您如何替换视图层次结构,您的 presented VC 都会关闭,这将向您的“pushedVC”发送viewWillAppear 消息......此时“pushedVC” " 将立即加载并重新呈现 "triggerVC"

你可能想做的是:

  • jumpToModalVC 等于false,直到你想使用它
  • 在呈现的“triggerVC”中点击按钮,关闭模态(self)
  • 关闭完成后,将 jumpToModalVC 设置为 true 并重建/重置您的层次结构

注意:

每个 VC 的 viewWillAppear 对 segue 的链式调用几乎总是会导致:

开始/结束外观转换的不平衡调用

为了避免这种情况,最好从viewDidAppear触发segues

如果您愿意,可以在您的 GitHub 存储库中将我添加为“协作者”(我的 GitHub 用户 ID 是 DonMag),我可以将所做的更改推送为新分支。

【讨论】:

  • 我发现有时即使在 viewDidAppear 中它也可能无法工作,直到我给它一些时间(异步 + 0.1 秒)。我也将您添加为合作者。谢谢!
  • hmmm...试图推送我的更改,但 GitHub 桌面告诉我我没有权限...
  • 它仍然显示为等待响应。我相信您必须先接受电子邮件中的邀请才能推送,如果您没有收到邀请,请告诉我!
  • 呃...我很少这样做,而且我与 GitHub 关联的电子邮件是我很少检查的...我向您的项目推送了一个新分支 - 试试看。
  • 非常感谢,我看到了分支的变化,明天我一定会检查/测试一下! (这里是睡觉时间)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 2021-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多