簡體   English   中英

Swift派生屬性KVO無法正常工作

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM