2012-08-17 30 views
3

我想以編程方式將自定義類(MyClass)數組綁定到數組控制器(NSArrayController),並將其內容綁定到另一個數組(modelArray)。 MyClass顯示器陣列的內容,例如一個NSTableView如何綁定到NSArrayController的排列對象

我的問題是:如何建立這種以這樣的方式使可變數組的方法被稱爲綁定,即方法

-(void) insertObject:(id)object inContentAtIndex:(NSUInteger)index 
-(void) removeObjectFromContent:(id) object 

(1)如果我以這種方式結合,上述方法被調用但控制器的內容不再綁定到modelArray(顯然)

[myArrayController bind:@"contentArray" toObject:myClassInstance withKeyPath:@"content" options:nil]; 

(2)如果我在這些方面結合只有setContent:content方法被調用,而不是可變的方法。此外,我一直試圖刪除這些方法(setContent:content),但它只是拋出一個異常setValue:forUndefinedKey:

[myClassInstance bind:@"content" toObject:myArrayController withKeyPath:@"arrangedObjects" options:nil]; 

[myClassInstance bind:@"content" toObject:myArrayController withKeyPath:@"content" options:nil]; 

我不認爲整個表的數組重新設置每次綁定到數組控制器時添加一行,並且我希望具有相同類型的綁定。

回答

2

問題您遇到有數組值是如何通過鍵值編碼處理的事情。 KVC沒有具體打字的概念,所以當你通過KVC訪問一個數組的值,它無法知道返回的數組是可變的方式。它必須假設最差(即數組是不可變的)。它通常用於處理這個問題的方法是使用代理對象,行爲像一個NSMutableArray,但幕後它需要你的假設,不變的陣列,使一個可變的副本,變異副本,然後推動整個事情重新使用二傳手。 (這是您看到的行爲 - 整個陣列正在被替換而不是在原位發生突變。)

控制此功能的方法是- (NSMutableArray *)mutableArrayValueForKey:(NSString *)key。有可能有很多在該方法回事,我會在標題註釋中粘貼下面這個方法給予完整的故事,但要長話短說,如果你想NSArrayController的變異你的可變數組到位,最簡單的辦法是此重寫添加到出售該modelArray屬性的類:

- (NSMutableArray *)mutableArrayValueForKey:(NSString *)key 
{ 
    if ([@"modelArray" isEqual: key]) 
    { 
     // We know this is mutable, even if KVC doesn't! 
     return self.modelArray; 
    } 
    return [super mutableArrayValueForKey:key]; 
} 

較長的故事是,有事情的序列KVC看起來試圖弄清楚如何處理收集的突變時。他們在NSKeyValueCoding.h詳細解釋。這些是對mutableArrayValueForKey:的評論。

鑑於標識有序一對多關係的關鍵,返回 一個可變的陣列,可提供給相關 對象進行讀寫訪問。對象添加到可變數組將成爲關係到 接收機,和對象從可變數組移除將變得 無關。

此方法的默認實現識別一樣簡單 訪問方法和數組訪問方法爲-valueForKey:'s和 遵循相同的直接實例變量的訪問策略,但始終 返回可變集合代理對象,而不是-valueForKey:將返回的不變的 集合。它還:

  1. 搜索類的接收器的對於名稱匹配-insertObject:in<Key>AtIndex:-removeObjectFrom<Key>AtIndex:(對應於由NSMutableArray的類中定義的兩個最原始的方法)的圖案的方法,和 (Mac OS中10.4引入)也-insert<Key>:atIndexes:-remove<Key>AtIndexes:(對應於-[NSMutableArray insertObjects:atIndexes:]-[NSMutableArray removeObjectsAtIndexes:])。如果至少一個插入方法和在 至少一種去除方法被發現發送到 每個的NSMutableArray消息收集代理對象將導致 -insertObject:in<Key>AtIndex:-removeObjectFrom<Key>AtIndex:-insert<Key>:atIndexes:-remove<Key>AtIndexes:消息的一些組合被髮送到的-mutableArrayValueForKey:原接收機。如果接收機的類別還實現了名稱爲 的模式-replaceObjectIn<Key>AtIndex:withObject:或 (Mac OS 10.4中引入)-replace<Key>AtIndexes:with<Key>:的 方法將在適當時用於最佳性能的可選方法。
  2. 否則(沒有找到任何一組數組變異方法),在接收者的類中搜索名稱與 模式-set<Key>:匹配的訪問方法。如果發現這種方法,則發送到收集代理對象的每個NSMutableArray 消息將導致將 -set<Key>:消息發送到-mutableArrayValueForKey:的原始接收方。
  3. 否則(沒有一套陣列突變方法或簡單的訪問方法被發現),如果接收器的類 +accessInstanceVariablesDirectly方法返回YES,搜索類的接收器的一個實例變量名稱的 圖案_<key><key>相匹配,以該順序。如果找到這樣一個實例變量 ,則發送到集合代理 對象的每個NSMutableArray消息都將被轉發給實例變量的值,因此該值通常必須是NSMutableArray的實例或NSMutableArray的子​​類。
  4. 否則(找不到數組變量方法,簡單訪問器方法或實例變量被找到),無論如何返回可變集合 代理對象。發送到 收集代理對象的每個NSMutableArray消息將導致將消息發送到原始接收者 -mutableArrayValueForKey:-setValue:forUndefinedKey:的默認實現會引發NSUndefinedKeyException,但您可以在應用程序中覆蓋它。
相關問題