我试图观察对Swift 4中NSPopUpButton选择的更改。在我的视图控制器的viewDidLoad()中,我设置了观察令牌来观察selectedItem属性NSPopUpButton
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?
,所以我怀疑是我无法对可选属性进行观察。但我无法在Apple的文档中找到任何可以说明是否属于这种情况的内容,而且我不确定如何为自己验证它。
所以我有一些主要问题和一些后续行动:
排除我已经尝试过的问题......
@objc dynamic
添加到我的myPopUpButton
声明答案 0 :(得分:1)
许多AppKit对象的许多属性不符合KVO标准。除非文档明确说明该属性是否合规,否则您应该认为它不符合要求。 NSPopUpButton
的{{1}}属性不合规。
通知弹出式按钮所选项目发生变化的最简单方法是设置按钮的selectedItem
和target
:
action
请注意,如果您在故事板或xib中创建弹出按钮,则可以通过控制从弹出按钮拖动到视图控制器来将其连接到 override func viewDidLoad() {
super.viewDidLoad()
myPopUpButton.target = self
myPopUpButton.action = #selector(popUpButtonDidFire(_:))
}
@IBAction private func popUpButtonDidFire(_ sender: Any) {
// code to execute goes here
}
方法。
答案 1 :(得分:1)
正如macOS中的评论所提到的,Cocoa Bindings和Swift的属性观察器是观察值的一种非常强大的方法,即使在之前的Swift版本中也是如此。不需要插座。
创建一个属性并使用didSet
观察者
@objc dynamic var selectedObject : MyObject? {
didSet {
}
}
在Bindings中的Interface Builder中,Inspector将Selected Object
绑定到目标控制器Model Key Path
> selectedObject
。
MyObject
是菜单项的代表对象的类型。如果未选择任何内容,则selectedObject
为nil
。您也可以绑定Selected Index
,Selected Tag
或Selected Value
(但不能同时绑定)。
答案 2 :(得分:-1)
创建一个动作@IBAction,并将按钮连接到它