我的视图层次结构如下:
Splash view -> "show" segue-> Tab Bar Controller (with 3 tabs)
那就是它。非常简单的应用程序。
在最后一个标签上,我有一个注销按钮。按下时,此注销按钮将执行展开segue 返回到启动视图。 (我猜这会破坏标签控制器及其所有3个视图......但如果我错了,请告诉我。)
所以我的问题是:
我的其他2个标签如何知道最后一个标签何时调出展开segue?我需要在用户再次看到启动页面之前删除观察者等。
答案 0 :(得分:1)
在标签栏控制器中,在prepareForSegue:
期间,确定正在执行的segue是否是展开segue(您需要为展开segue分配标识符)。
在确定segue是一个展开segue后,您可以通知Tab Bar Controller中的控制器,他们现在应该删除观察者和所有需要的进程。
替代方法:您可以在选项卡栏控制器的每个控制器的dealloc
方法内进行此操作
答案 1 :(得分:1)
实现此目的的最简单方法是像平常一样放松,让正常的释放过程为您移除观察者。但是,要做到这一点,你必须确保你没有强大的参考周期。
让我们想象你有一个观察者在内存压力下清空缓存。如果要在取消分配对象时删除该观察者,请使用unowned self
引用:
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)
}
你没有分享你正在观察的内容,但它说明了这个想法:在提供给[unowned self]
的闭包中使用addObserverForName
来打破强参考周期。有关闭包中weak
和unowned
对self
的引用的详细信息,请参阅 Swift编程语言中的Resolving Strong Reference Cycles for Closures。