[英]Swift derived property KVO not working issue
我想實現一個NSCollectionViewItem
類,它提供源自一個只讀屬性representedObject
,簡化代碼如下所示
class PersonItem : NSCollectionViewItem {
var fullName:String! {
get {
if let obj = representedObject as? Person {
return "\(obj.firstName) \(obj.lastName)"
}
return "none"
}
}
}
當然,我可以通過類似的方式獲得價值
person.fullName
但是,提供此屬性的原因是我想將其綁定到xib文件中的UI。 該志願似乎只適用於變化representedObject
,但如果該值是從這個fullName
屬性,它根本不起作用。 我注意到有一個類方法
keyPathsForValuesAffectingValueForKey
用於通知派生屬性的更改,但無法在Swift類中覆蓋它。 似乎那里沒有提供此方法,說沒有找到,即使該類也從NSCollectionViewItem
繼承。
因此,問題是如何使KVO對此fullName
屬性也起作用?
三件事:首先,正如注釋中提到的“陽光”,您需要使用dynamic
關鍵字標記您的屬性,以便可以使用鍵值編碼來訪問它,這是鍵值觀察的先決條件。
其次, keyPathsForValuesAffectingValueForKey()
是一個類方法。 因此,要覆蓋它,您必須使用:
override class func keyPathsForValuesAffectingValueForKey(_ key: String) -> Set<String> {
// ...
}
第三,但是,不要那樣做。 從keyPathsForValuesAffectingValueForKey()
的文檔中:
此方法的默認實現在接收類中搜索名稱與模式
+keyPathsForValuesAffecting<Key>
匹配的方法,如果找到該方法,則返回調用該方法的結果。
因此,更好的選擇是實施:
dynamic class func keyPathsForValuesAffectingFullName() -> Set<String> {
return ["representedObject.firstName", "representedObject.lastName"]
}
該方法也需要dynamic
,因為它是按名稱查找的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.