我有这段代码:
alert.addTextFieldWithConfigurationHandler { field in
field.placeholder = "password"
field.secureTextEntry = true
NSNotificationCenter.defaultCenter().addObserverForName(UITextFieldTextDidChangeNotification,
object: field, queue: NSOperationQueue.mainQueue()) { n in
delete.enabled = field.text?.characters.count >= 2 }
}
我想知道如何从" field"中移除观察者。当包含视图被解雇时?因为' field'只存在于闭包内部,我不知道如何获取它的引用,我可以稍后传递给removeObserver。
或者我甚至需要删除观察者?当字段最终被解除分配时,它会自行删除吗?
更新
我意识到在这种特定情况下,我可以通过执行以下操作来检索对该字段的引用并删除观察者:
if let alert = alert, textFields = alert.textFields where textFields.count > 0 {
NSNotificationCenter.defaultCenter().removeObserver(textFields[0])
}
但我会稍微提出这个问题,因为我对我所做的一般情况感到好奇
{
let x = Object()
NSNotificationCenter.defaultCenter().addObserverForName("thing",
object: x, queue: NSOperationQueue.mainQueue())
}()
更新更新
Per @rmaddy,我的更新错了。我让观察者和观察对象感到困惑。
Per @ leo-dabus我应该做的
weakSelf?.observer = NSNotificationCenter.defaultCenter().addObserverForName(UITextFieldTextDidChangeNotification,
object: field, queue: NSOperationQueue.mainQueue()) { n in
delete.enabled = field.text?.characters.count >= 2 }
然后在解除警报的行动中:
if let observer = weakSelf?.deleteAlertObserver {
NSNotificationCenter.defaultCenter().removeObserver(observer)
}
答案 0 :(得分:4)
看起来这里的共识答案是我们应该在外部作用域中创建一个变量来保存对在内部作用域中创建的观察者的引用。然后,当不再需要观察者时,我们可以将其删除。所以,有些东西:
import UIKit
class Pointless
{
var observer: NSObjectProtocol?
init () {
class SomeObject {}
observer = NSNotificationCenter.defaultCenter().addObserverForName("something",
object: SomeObject(), queue: NSOperationQueue.mainQueue()) { n in
print(n)
}
}
deinit
{
if let observer = observer{
NSNotificationCenter.defaultCenter().removeObserver(observer)
}
}
}