2

我有一个标签栏控制器,其中一个标签包含一个表格视图。单击一行时,我会选择一个新的子控制器。

在这个新控制器中,我有一个 deinit 删除观察者并打印“控制器在此处取消初始化”。

当我按下导航栏中的后退按钮时,我可以看到在此操作上调用了 de-init。

现在......我在该子控制器中有另一种方法,它设置选项卡栏控制器的活动选项卡。发生此操作时,我看不到指示在这种情况下未调用 de-init 的打印语句。

我想知道如何解决这个问题?如果不调用 deinit,我担心我会在内存中保留额外的东西。

更新: 在我设置活动选项卡的方法中,我还想在当前活动的子控制器上 popToRoot。我尝试了以下方法:

self.navigationController!.popViewControllerAnimated(true)
self.tabBarController?.selectedIndex = 2

我收到以下错误:

popViewControllerAnimated: called on <UINavigationController 0x15609a200> while an existing transition or presentation is occurring; the navigation stack will not be updated.

这是有道理的,但我想知道,有没有办法解决这个问题?

更新 2

为了避免上述问题,我将 popToRoot 放在我的观察者中,并将 tabbar.setSelectedIndex 添加到 viewDidDisappear 中。

func checkForSeg(){
      //self.tabBarController?.selectedIndex = 2
      self.navigationController!.popViewControllerAnimated(true)
 }

 override func viewDidDisappear(animated: Bool) {
      super.viewDidDisappear(true)
      print("view Did Disappear called?")
      self.tabBarController?.selectedIndex = 2
 }

但我不明白为什么当我按下导航返回栏按钮时标签栏没有切换索引(我不想要它,但我不明白为什么?)

当我在 checkForSeg 函数中显式调用 popToRoot 时,viewDidDisappear 会执行“tabbar.setSelectedIndex”行(根据需要),但是当我按下导航返回栏按钮时(也不需要)。我不明白这是为什么?因为我没有为何时应该或不应该执行选项卡更改实现任何自定义逻辑。

另外,我每次都会收到打印声明

4

1 回答 1

3

在 aUITabBarController中切换选项卡时,不会从内存中释放前一个选项卡的控制器。

这是预期的行为。

如果您返回到您所指的选项卡,您会看到子 VC 仍然活着并且很好。

在应用程序执行期间,任何选项卡的当前活动VC 将始终驻留在内存中。

因此,至少在使用 时UITabBarControllers,每个选项卡上的根 viewController 都保存在内存中,并且仅在应用程序终止或 tabBarController 终止时才释放。

这里没有问题。

于 2015-12-16T12:29:24.810 回答