【发布时间】:2016-03-22 13:44:01
【问题描述】:
我有一个标签栏控制器,其中一个标签包含一个表格视图。当点击一行时,我会选择一个新的子控制器。
在这个新控制器中,我有一个 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”行(根据需要),但是当我按下导航返回栏按钮时(也不需要)。我不明白这是为什么?因为我还没有实现任何自定义逻辑来判断何时应该或不应该执行选项卡更改。
另外,我上午每次都会收到打印声明。
【问题讨论】:
-
你不应该依赖 deinit 来移除观察者。您可以使用显式调用的自定义方法来执行此操作。参考:stackoverflow.com/a/18560069/5060335
-
@Udits 我可以在设置活动选项卡的方法中放入删除观察者,没问题,但我只是担心调用 deinit 时在后台发生的其他事情。 (弧线做它的事情,主要是释放内存)以及如何在子视图控制器中以最有效的方式设置活动选项卡
标签: ios swift uinavigationcontroller observers deinit