选项卡控制器中的视图控制器如何知道它何时被展开?
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]
来打破强引用循环。有关闭包中对 self
的 weak
和 unowned
引用的详细信息,请参阅 Swift 编程语言中的 Resolving Strong Reference Cycles for Closures。
我的视图层次结构是这样的:
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]
来打破强引用循环。有关闭包中对 self
的 weak
和 unowned
引用的详细信息,请参阅 Swift 编程语言中的 Resolving Strong Reference Cycles for Closures。