如何查看选项卡控制器中的控制器何时解除它?

时间:2015-04-07 03:34:53

标签: ios cocoa-touch swift uiviewcontroller uitabbarcontroller

我的视图层次结构如下:

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

那就是它。非常简单的应用程序。

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

所以我的问题是:

我的其他2个标签如何知道最后一个标签何时调出展开segue?我需要在用户再次看到启动页面之前删除观察者等。

2 个答案:

答案 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来打破强参考周期。有关闭包中weakunownedself的引用的详细信息,请参阅 Swift编程语言中的Resolving Strong Reference Cycles for Closures