属性 在另一个视图控制器中的内联 KVO
Inline KVO of a Property in another view controller
我有一个带有动态变量 "value" 的 vc,我需要知道它何时在调用 cv 的闭包中更改。
目标vc:
@objc dynamic var value: String = ""
来源:
if let vc: TagButtonPopupViewController = sb.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier("TagPopupViewController")) as? TagButtonPopupViewController {
// configure vc
vc.value = sender.title
// observe
_ = vc.observe(\.value) { (tbvc, change) in
print("new string")
}
// present popup
presentViewController(vc, asPopoverRelativeTo: sender.bounds, of: sender, preferredEdge: NSRectEdge.maxY, behavior: NSPopover.Behavior.transient)
}
但 "observe" 从未被调用。
任何想法如何在 "value" 在 Swift4 中发生变化时在闭包中得到通知?
由于没有引用,观察者被销毁
在呈现另一个视图控制器之后。
你必须存储它
observer = vc.observe(\.value) { ... }
其中 observer
是调用视图控制器的 属性。
一个独立的命令行项目示例:这会按预期打印 "new string":
class A: NSObject {
@objc dynamic var value: String = ""
}
let a = A()
let observer = a.observe(\.value) { (_, _) in print("new string") } // (*)
a.value = "Hello world"
但是如果 (*)
被替换为
则不会打印任何内容
_ = a.observe(\.value) { (_, _) in print("new string") }
我有一个带有动态变量 "value" 的 vc,我需要知道它何时在调用 cv 的闭包中更改。
目标vc:
@objc dynamic var value: String = ""
来源:
if let vc: TagButtonPopupViewController = sb.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier("TagPopupViewController")) as? TagButtonPopupViewController {
// configure vc
vc.value = sender.title
// observe
_ = vc.observe(\.value) { (tbvc, change) in
print("new string")
}
// present popup
presentViewController(vc, asPopoverRelativeTo: sender.bounds, of: sender, preferredEdge: NSRectEdge.maxY, behavior: NSPopover.Behavior.transient)
}
但 "observe" 从未被调用。 任何想法如何在 "value" 在 Swift4 中发生变化时在闭包中得到通知?
由于没有引用,观察者被销毁 在呈现另一个视图控制器之后。 你必须存储它
observer = vc.observe(\.value) { ... }
其中 observer
是调用视图控制器的 属性。
一个独立的命令行项目示例:这会按预期打印 "new string":
class A: NSObject {
@objc dynamic var value: String = ""
}
let a = A()
let observer = a.observe(\.value) { (_, _) in print("new string") } // (*)
a.value = "Hello world"
但是如果 (*)
被替换为
_ = a.observe(\.value) { (_, _) in print("new string") }