我可以在swift中观察一个可选值吗?如果没有,我怎么去尝试观察变化呢?

时间:2018-03-21 19:24:21

标签: swift macos swift4 key-value-observing

我试图观察对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的文档中找到任何可以说明是否属于这种情况的内容,而且我不确定如何为自己验证它。

所以我有一些主要问题和一些后续行动:

  • 我可以在Swift 4.1中观察一个可选属性吗?
    • 如果是这样,我怎么解决这个问题,我做错了什么?
    • 如果没有,我怎样才能尝试监控NSPopUpButton的状态?

排除我已经尝试过的问题......

  • @objc dynamic添加到我的myPopUpButton声明

3 个答案:

答案 0 :(得分:1)

许多AppKit对象的许多属性符合KVO标准。除非文档明确说明该属性是否合规,否则您应该认为它不符合要求。 NSPopUpButton的{​​{1}}属性不合规。

通知弹出式按钮所选项目发生变化的最简单方法是设置按钮的selectedItemtarget

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是菜单项的代表对象的类型。如果未选择任何内容,则selectedObjectnil。您也可以绑定Selected IndexSelected TagSelected Value(但不能同时绑定)。

答案 2 :(得分:-1)

创建一个动作@IBAction,并将按钮连接到它