选项卡控制器中的视图控制器如何知道它何时被展开?

How can view controllers in a tab controller know when it is being unwinded?

我的视图层次结构是这样的:

Splash view -> "show" segue-> Tab Bar Controller (with 3 tabs)

就是这样。非常简单的应用程序。

在最后一个选项卡上,我有一个注销按钮。按下后,此注销按钮将执行 unwind segue 返回到启动视图。 (我猜这会破坏选项卡控制器及其所有 3 个视图...但如果我错了请告诉我)。

所以我的问题是:

我的其他 2 个选项卡如何知道最后一个选项卡何时调用展开转场?在用户再次看到初始页面之前,我需要删除观察者等。

在Tab Bar Controller中,在prepareForSegue:期间,识别正在执行的segue是否是unwind segue(您需要为unwind segue分配一个标识符)。

在确定转场是展开转场之后,您可以通知选项卡栏控制器中的控制器,他们现在应该删除观察者和所有需要的进程。

备选方案:您可以在标签栏控制器

的每个控制器的dealloc方法中进行

完成此操作的最简单方法是像往常一样展开,让正常的重新分配过程为您删除观察者。不过,要做到这一点,您必须确保没有强引用循环。

让我们假设您有一个观察者在内存压力时清空缓存。如果你想在对象被释放时移除那个观察者,你可以使用 unowned self reference:

let cache = NSCache()
var observer: NSObjectProtocol!

override func viewDidLoad() {
    super.viewDidLoad()

    observer = NSNotificationCenter.defaultCenter().addObserverForName(UIApplicationDidReceiveMemoryWarningNotification, object: nil, queue: nil) { [unowned self] notification in
        self.cache.removeAllObjects()
    }
}

那么你就可以安全地移除 deinit 中的观察者,而不用担心强引用循环:

deinit {
    NSNotificationCenter.defaultCenter().removeObserver(observer)
}

您没有分享您观察到的内容,但它说明了这个想法:通过在提供给 addObserverForName 的闭包中使用 [unowned self] 来打破强引用循环。有关闭包中对 selfweakunowned 引用的详细信息,请参阅 Swift 编程语言中的 Resolving Strong Reference Cycles for Closures