Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以在swift中观察可选值吗?如果没有,我如何尝试观察变化?_Swift_Macos_Swift4_Key Value Observing - Fatal编程技术网

我可以在swift中观察可选值吗?如果没有,我如何尝试观察变化?

我可以在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

我试图观察Swift 4中NSpoupButton选择的变化。在我的视图控制器的viewDidLoad()中,我设置了观察标记,以观察NSPopUpButton的selectedItem属性

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的状态
我已经尝试过的疑难解答

  • @objc dynamic
    添加到my
    myPopUpButton
    声明中

许多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
方法。

许多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