我可以在swift中观察可选值吗?如果没有,我如何尝试观察变化?
我试图观察Swift 4中NSpoupButton选择的变化。在我的视图控制器的viewDidLoad()中,我设置了观察标记,以观察NSPopUpButton的selectedItem属性我可以在swift中观察可选值吗?如果没有,我如何尝试观察变化?,swift,macos,swift4,key-value-observing,Swift,Macos,Swift4,Key Value Observing,我试图观察Swift 4中NSpoupButton选择的变化。在我的视图控制器的viewDidLoad()中,我设置了观察标记,以观察NSPopUpButton的selectedItem属性 override func viewDidLoad() { super.viewDidLoad() observation = observe(\.myPopUpButton.selectedItem) { objectToObserve, change in
override func viewDidLoad() {
super.viewDidLoad()
observation = observe(\.myPopUpButton.selectedItem) {
objectToObserve, change in
if change.kind == NSKeyValueObservedChange.Kind.setting {
// code to execute goes here
}
}
我在设置了observation
的行上设置了一个断点,以确定令牌配置了正确的密钥路径。我还在闭包内部设置了一个中断,以查看何时执行它。当我更改NSPopUpButton的选择时,闭包不会执行
selectedItem
属于类型,NSMenuItem?
,因此我怀疑我无法对可选属性设置观察。但我在苹果的文档中找不到任何说明是否属实的内容,我也不确定我将如何亲自验证
因此,我有一个主要问题,以及一些后续问题:
- 我可以观察Swift 4.1中的可选属性吗?
- 如果是这样,我如何排除故障,我做错了什么
- 如果没有,我如何开始尝试监视NSPoupButton的状态
- 将
添加到my@objc dynamic
声明中myPopUpButton
nspoupbutton
的selectedItem
属性不符合要求
通知弹出按钮所选项目已更改的最简单方法是设置按钮的目标
和操作
:
override func viewDidLoad() {
super.viewDidLoad()
myPopUpButton.target = self
myPopUpButton.action = #selector(popUpButtonDidFire(_:))
}
@IBAction private func popUpButtonDidFire(_ sender: Any) {
// code to execute goes here
}
请注意,如果要在故事板或xib中创建弹出按钮,可以通过将控件从弹出按钮拖动到视图控制器,将其连接到
popUpButtonDidFire
方法。许多AppKit对象的许多属性都不符合KVO。除非文档中明确说明该属性符合要求,否则应假定它不符合要求nspoupbutton
的selectedItem
属性不符合要求
通知弹出按钮所选项目已更改的最简单方法是设置按钮的目标
和操作
:
override func viewDidLoad() {
super.viewDidLoad()
myPopUpButton.target = self
myPopUpButton.action = #selector(popUpButtonDidFire(_:))
}
@IBAction private func popUpButtonDidFire(_ sender: Any) {
// code to execute goes here
}
请注意,如果要在故事板或xib中创建弹出按钮,可以通过将控件从弹出按钮拖动到视图控制器,将其连接到
popUpButtonDidFire
方法。如macOS Cocoa Bindings和Swift的property Observators中的注释所述,是观察值的非常强大的方法,甚至在以前的Swift版本中。不需要插座
创建属性并使用didSet
observer
@objc dynamic var selectedObject : MyObject? {
didSet {
}
}
在绑定检查器的界面生成器中,将所选对象绑定到目标控制器模型密钥路径所选对象
MyObject
是菜单项所表示对象的类型。如果未选择任何内容,selectedObject
为nil
。您还可以绑定Selected Index
、Selected Tag
或Selected Value
(但不能同时绑定)。正如macOS Cocoa Binding和Swift的property Observators中的注释所述,即使在以前的Swift版本中,也是观察值的一种非常强大的方式。不需要插座
创建属性并使用didSet
observer
@objc dynamic var selectedObject : MyObject? {
didSet {
}
}
在绑定检查器的界面生成器中,将所选对象绑定到目标控制器模型密钥路径所选对象
MyObject
是菜单项所表示对象的类型。如果未选择任何内容,selectedObject
为nil
。您还可以绑定选定索引
、选定标记
或选定值
(但不能同时绑定)。使用绑定。我不明白为什么您不能观察一个可选属性,只要它在启动时存在。也许在观察行之前添加一个测试,以确保所有内容都在您认为的位置。使用绑定。我不明白为什么您不能观察一个可选属性,只要它在启动时存在。也许在观察线之前添加一个测试,以确保一切都在您认为的位置。谢谢,这非常有效!将来,我必须记住,苹果的文档中明确规定了与KVO兼容的属性。如果所选索引不可观察到KVO,那么绑定是如何工作的?绑定是KVO。不,绑定不是KVO。绑定使用KVO读取模型(或控制器)值,并使用KVC设置模型(或控制器)值。但是,视图上的绑定不一定符合KVC或KVO。例如,考虑<代码> NSPopUpButton <代码>公开了<代码> CordObjs< /Cult>绑定,但它没有<代码> CordObjs< /Cord>属性。我并不是说它没有文档化的contentObjects
属性;我的意思是,如果您发送一条contentObjects
消息,您将收到一个无法识别的选择器错误。谢谢,这非常有效!将来,我必须记住,苹果的文档中明确规定了与KVO兼容的属性。如果所选索引不可观察到KVO,那么绑定是如何工作的?绑定是KVO。不,绑定不是KVO。绑定使用KVO读取模型(或控制器)值,并使用KVC设置模型(或控制器)值。但是,视图上的绑定不一定符合KVC或KVO。例如,考虑<代码> NSPopUpButton <代码>公开了<代码> CordObjs< /Cult>绑定,但它没有<代码> CordObjs< /Cord>属性。我并不是说它没有文档化的contentObjects
属性;我的意思是如果你发送一个contentObjects
messa