首页 > 解决方案 > 带有 UIButtons 的 Swift Keypath

问题描述

我正在尝试获取类中 IBOutlet 的选定属性的键路径。但是得到: Type 'UIButton?' has no member 'isSelected'

直接访问 UIButton.isSelected 键路径有效,但不能满足我的用例。

@objc class Demo: UIViewController{
    @IBOutlet @objc dynamic weak var button: UIButton!
}

var demo = Demo()

print(#keyPath(UIButton.isSelected)) // no error
print(#keyPath(Demo.button.isSelected)) // error
print(#keyPath(demo.button.isSelected)) // error

我错过了什么?

标签: iosswiftkeypathsswift-keypath

解决方案


#keyPath只是创建字符串值的语法糖,同时确保对keyPath您指定的对象有效;它有助于在使用 KVO 时防止崩溃,因为它会在编译时验证您keyPath是否有效,而不是在运行时崩溃(如果不是)。

因此,您无需keyPath在特定实例上指定 a,而是在对象类型上指定它。这就是为什么您的第一行有效而后两行无效的原因。

keyPath您在调用时指定要观察的特定对象实例addObserver

demo.addObserver(someObserver, forKeyPath: #keyPath(UIButton.isSelected), options: [], context: nil)

你也可以说

demo.addObserver(someObserver, forKeyPath: "selected", options: [], context: nil)

结果相同

但是,如果您不小心键入"slected"而不是在"selected"您的应用程序在运行时崩溃之前您不会发现,while#keyPath(UIButton.isSlected)会立即给您一个编译器错误。


推荐阅读