2015-10-04 77 views
1

有沒有辦法將NSArrayController的內容數組綁定到非技術上不是數組的自定義對象,但其行爲如同一個?將NSArrayController的內容數組綁定到一個自定義(非數組)對象

具體而言,我試圖將NSTableView綁定到PDFDocument(因此,該表中的每行爲PDFPage)。 PDFDocument不是數組,但有許多相同類型的方法(如insertPage:atIndex:removePageAtIndex:等)。

我最終想寫一個包裝,將PDFDocument的方法轉換爲NSMutableArray的方法,但我不確定要採取什麼方法。我做了一些嘗試,綁定似乎不能正常工作。

或者更具體地說,將表綁定到PDFDocument的頁面以模仿PDFThumbnailView(對於那些瞭解PDFKit的人)的任何方式?

謝謝!

回答

2

綁定建立在鍵值觀察和鍵值編碼上。

要僅查詢PDFDocument的頁面,陣列控制器和綁定將使用-valueForKey:。如Key-Value Coding Programming Guide: Accessor Search Implementation Details所述,這將使用各種命名模式來搜索簡單的吸氣劑。由於「pages」屬性沒有簡單的getter,它將搜索indexed collection accessors。特別是,它會尋找-countOfPages-objectInPagesAtIndex:-pagesAtIndexes:之一。這些在PDFDocument中都不存在,但存在非常類似的方法。您可以使用類別的可用方法來實現這些。

但是,如果PDFDocument將要改變它的頁面列表,並且您希望陣列控制器自動接收這些更改,則會出現問題。必須以符合KVO的方式對屬性進行修改,以便綁定才能接受更改。如果插入例程名爲-insertObject:inPagesAtIndex:,那將是KVO兼容的,但事實並非如此。它被命名爲-insertPage:atIndex:,KVO無法識別。這不是您可以使用某個類別修復的問題,因爲重要的是使用什麼方法,而不是僅有哪些方法可用。

你可以嘗試使用的PDFDocument一個子類覆蓋-insertPage:atIndex:前,並呼籲通過超後打電話到-willChange:valuesAtIndexes:forKey:-didChange:valuesAtIndexes:forKey:。但是,並不能保證所有的插入操作都通過公共方法。有時候類可能會直接修改它的內部狀態而不調用任何子類可以正確覆蓋的方法。 (所有相同的適用於去除方法。)

如果你所有的突變是通過你的代碼發起肯定,可以使你的代碼中使用了符合國際志願者組織的方法,你就必須執行在一個類別或子類中。

+0

非常感謝這麼一個徹底的答案 - 令人難以置信。我確實試圖通過綁定來改變'PDFDocument',這就解釋了爲什麼它不起作用。子類的想法聽起來像是首先嚐試的最佳方法。再次感謝你的幫助。 –

+0

如果您試圖讓綁定變更文檔,那麼您需要實現索引集合變異訪問器:'-insertObject:inPagesAtIndex:'或'-insertPages:atIndexes:'和'-removeObjectFromPagesAtIndex之一:'或'-removePagesAtIndexes:'。那些可以調用不符合KVC或KVO預期的超類方法。如果你實現了這些,你不必也不應該調用'-willChange ...'或'-didChange ...'。這是因爲KVO已經知道要掛鉤這些方法來自動生成更改通知。這可以通過一個類別完成。 –