當我期待它時,我的UI未更新。使用KVO更新由NSPredicate過濾的NSTableView
應用程序使用類似於iTunes的視圖顯示「項目」 - 左側的源列表允許您在右側過濾列表(NSTableView)。我的過濾器在檢查任何簡單字段(如名稱,字符串)時更新正確,但不適用於數組(如標籤)。我從一個對象(從名爲「tags」的NSMutableArray字段)中刪除一個標記,我期望它從列表中消失,因爲它不再匹配綁定到我的表的NSArrayController的謂詞。
ProjectBrowser.mm:
self.filter = [NSPredicate predicateWithFormat:@"%@ IN %K",
selectedTag,
@"tags"];
Project.mm:
[self willChangeValueForKey:@"tags"];
[tags removeAllObjects];
[self didChangeValueForKey:@"tags"];
我也試過,但結果是一樣的:
[[self mutableArrayValueForKey:@"tags"] removeAllObjects];
界面生成器設置:
- 一個ProjectBrowser對象是XIB的文件所有者
- 一個NSArrayController(項目控制器)具有結合到「文件的所有者」的內容數組.projects
- 項目控制器的過濾器謂詞被綁定到「文件的所有者」 .filter
- NSTableView的列綁定到「項目控制器」。名稱
感謝您指出語法錯誤,它發生在我嘗試提取相關代碼的過程中。我已經在上面糾正了它。 – KingRufus 2010-05-20 10:40:55
我沒有觀察標籤,但謂詞似乎在需要時觀察簡單的字段。這個過濾器會在名稱發生變化時更新列表:[.. predicateWithFormat:@「%K ==%@」,@「name」,selectedName]因此,如果我沒有傳播變更通知,我解決這個問題? 使用像「project.someObject.someField」這樣的keypath進行觀察的KVO能力使我相信,這些改變應該「向上冒泡」給觀察者,而不需要鏈/路徑中每個鏈接上的粘合代碼。目前,數組在我的代碼的keypath觀察功能中打破了任何鏈。 – KingRufus 2010-05-20 10:50:14
另一個猜測:可能是因爲您沒有更改標籤對象本身,謂詞正在優化您的更改。嘗試'[標籤發佈]; tags = [[NSMutableArray alloc] init];'而不是'[tags removeAllObjects]' – JeremyP 2010-05-20 16:24:46