带有UIButtons的Swift关键路径

时间:2019-07-08 07:27:44

标签: ios swift keypaths 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

我想念什么?

1 个答案:

答案 0 :(得分:2)

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

)。

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

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

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

您也可以说

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

结果相同

但是,如果您不小心键入了"slected"而不是"selected",直到应用程序在运行时崩溃,您才会发现,而#keyPath(UIButton.isSlected)会立即给您带来编译器错误。