ios - 带有 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
我错过了什么?
解决方案
#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)
会立即给您一个编译器错误。
推荐阅读
- java - 找出从当前旋转到目标旋转所需的最小旋转
- spring - 为什么我们需要在spring security configure(HttpSecurity http)方法中调用http.addFilterBefore()方法?
- javascript - 如何有效地连接 Uint8Array?
- python - 错误:'NoneType' 对象在 read_sql 时不可迭代
- mysql - 随机生成独一无二的海量数据
- python - 使用 group-by 计算 Pandas 数据帧上的累积移动平均值
- d3.js - d3(多系列)折线图正在填充
- rust - Async Rust 中每个 Future 的不同上下文或唤醒器
- python - 删除其中包含特定字符串的行
- python - Web 浏览器 chrome,无法在新窗口中打开 URL,一直将 URL 作为选项卡打开