2017-04-26 131 views
0

我想通過視圖控制器找出將NSArrayController(依次綁定到表視圖)綁定到NSDocument實例的NSArray屬性的正確方法有困難。如何將數組控制器綁定到NSDocument數組屬性?

我的NSDocument子類有一個屬性NSArray * pages。我首先在視圖控制器中鏡像了pages屬性,但這意味着當NSDocument將項目添加到其pages數組時,表視圖不會更新。在這種情況下強制更新的唯一方法是在視圖控制器中的will../didChangeValueForKey:@"pages",但這種情況在視圖控制器未觸發更改時不實用。在NSDocument中直接調用will/didChangeValueForKey不會觸發陣列控制器更新。

我試圖直接綁定到ViewController的document.pages,但這似乎不起作用,或者至少不會顯示任何更新。

什麼是正確的技術在這裏使用?

+0

您是否檢查'pages'屬性是否遵循[KVO Compliance]的規則(https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/KeyValueObserving/Articles/KVOCompliance.html#//apple_ref/DOC/UID/20002178-BAJEAIEE)? – Willeke

+0

由於NSDocument從NSObject繼承,我認爲它是KVO兼容的。 pages屬性被定義爲'@property(nonatomic,strong)NSMutableArray * pages;' - 據我所知,這應該是所有必需的,對吧? – fbitterlich

+0

如果你做'self.pages = someArray'是的,如果你做'[self.pages addObject:someObject]'否。你必須使用'mutableArrayValueForKey:'或'willChange:valuesAtIndexes:forKey:'/'didChange:valuesAtIndexes:forKey:'。 – Willeke

回答

0

已解決 - 即使問題不在我尋找它的地方。

我陣列控制器結合這樣創造了一個document屬性:

- (Document *)document { 
    return (Document *)self.view.window.windowController.document; 
} 

那是不行的,因爲它不是志願兼容。解決方案是簡單地將NSDocument實例分配給self.representedObject,這是一個「真實」屬性,因此可以觀察到。

包裝更改爲pages數組willChangeValudForKey:/didChangeValueForKey:確實工作,以更新綁定的陣列控制器如預期,雖然Willeke在他的評論中提出的更爲具體的版本可能是比較正確的。

相關問題