2015-04-07 29 views
1

我的视图层次是这样的:标签控制器中的视图控制器如何知道它何时被解开?

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

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

在最后一个选项卡上,我有一个注销按钮。推送时,此注销按钮将执行返回到飞溅视图的展开segue。 (我猜这破坏了选项卡控制器及其所有3个视图...但请让我知道如果我错了)。

所以我的问题是:

如何将我的其他2个选项卡知道什么时候回卷赛格瑞正在由最后一个标签叫什么?我需要在用户再次看到启动页面之前删除观察者等。

+0

@Rob是“addObserverForName”,最后有一个闭包被认为是基于块的观察者? – TIMEX

回答

1

每个控制器的dealloc方法里面完成,这是刚刚放松正常人一样,让正常的释放过程中去除观察员你的最简单方法。但要做到这一点,您必须确保您没有强大的参考周期。

让我们假设您有一位观察者在内存压力下清空缓存。如果你想删除的观察者当对象被释放,你会使用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) 
} 

您没有分享您正在观察的内容,但它说明了这个想法:通过在提供给addObserverForName的闭包中使用[unowned self]来打破强参考周期。有关weakunowned引用self的更多信息,请参阅Resolving Strong Reference Cycles for ClosuresSwift编程语言。

+0

我可以在任何地方将[无主自我]放在封闭处吗?只是为了安全起见? – TIMEX

+0

没有时候你想要'[weak self]'(如果在闭包运行之前有可能将对象解除分配)。一个常见的例子就是在视图控制器发布后,您可能会合理预期的网络请求。有时你需要强有力的参考(即既不是“无主”也不是“弱”)。你真的应该考虑对特定情况有意义的对象所有权结构。 – Rob

1

在选项卡栏控制器中,在prepareForSegue:期间,识别正在执行的继续是否为退风继续(您需要为退出继续指定一个标识符)。

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

替代:你可以做它的标签栏控制器

+0

我的选项卡栏控制器没有自己的swift文件(尽管其中的3个控制器有自己的swift文件)。它是否应该有自己的swift文件来检查prepareForSegue? – TIMEX

+0

是的。或者,您可以在dealloc期间执行此操作。当选项卡栏控制器从视图层次结构中弹出时,其视图控制器将被解除分配 –

+0

为什么说“dealloc”被标记为不可用?我也尝试过deinit {},但是当我从其中一个选项卡中解开时,它不会被调用。 – TIMEX

相关问题