2

首先:我已經在這裏閱讀了幾次與這個問題有關的問題,我發佈了這個意識,人們可能會認爲這是一個重複的問題。但是我不得不說,作爲初學者,我還沒有找到任何有用的信息,所以我希望這個問題對我和其他人都很清楚。如何爲KVO使用mutableArrayValueForKey?

如何理解綁定& KVC /志願

考慮一下:我有一個數組(在我的AppDelegate),一個ArrayController和視圖元素,比如,NSTableView的。我將AppDelegate中的NSMutableArray綁定到ArrayController,而後者又綁定到NSTableView。

在NSTableView中更改某個對象的屬性會導致該對象屬性的實際更改。到目前爲止它的工作。但是,更改NSMutableArray中的某些內容(例如添加項目)不會更新NSTableView。

可能的解決方案我現在已經讀到

我已閱讀多個答案。一個答案似乎表明,我不應該添加任何東西到數組本身,但只能添加到ArrayController。我不確定這是否正確,但如果這是一個可能的解決方案,那麼獲得關於如何做到這一點的更多細節將是非常好的。

其他解決方案提了以下方法:

  • valueForKey:
  • valueForKeyPath:
  • dictionaryWithValuesForKeys:
  • valueForUndefinedKey:
  • mutableArrayValueForKey:

特別:

  • mutableArrayValueForKey:

如何使用mutableArrayValueforKey?

我在做什麼不是然而,知道如何在我的應用程序中使用這些方法中的任何一種。 mutableArrayValueForKey方法返回一個NSMutableArray。我必須用這個創建一個新的數組嗎?

現在,我正在做的是這樣的。

self.vocabList = [[NSMutableArray alloc] init]; 

,後來,在一個方法,我填充數組:

for (NSObject* o in meaningsArray) 
{ 
    NSLog(@"%@",o); 

    Vocab *temp = [[Vocab alloc] init]; 

    [temp setValue:@"w" forKey:@"word"]; 
    [temp setValue:@"m" forKey:@"meaning"]; 

    [self.vocabList insertObject:temp atIndex:[self.vocabList count]]; 
} 

如果一切我所說的是正確的,到目前爲止,我的問題是:會在哪裏mutableArrayValueForKey:進入圖片當想要更新NSTabeleView?或者我是否首先誤解了某些東西?

回答

1

如果您想要更改數組中的smth並觀察更改,則應該更改此數組的可變Proxy,而不是數組本身。 mutableArrayValueForKey:返回可變代理對象

例如:

我有數組:

NSMutableArray* selectedIndexPaths; 

我補充觀察員:

[self addObserver:self forKeyPath:@"selectedIndexPaths" options:0 context:NULL]; 

方法檢查的變化:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 
    if([keyPath isEqualToString:@"selectedIndexPaths"]) {...}} 

方法來改變在...裏面數組:

- (void)removeObjectFromSelectedIndexPathsAtIndex:(NSUInteger)index{ 
    NSMutableArray* arr = [self mutableArrayValueForKey:@"selectedIndexPaths"]; 
    if (arr) [arr removeObjectAtIndex:index]; 
} 

- (void) addIndexPathToSelected : (NSIndexPath*) object{ 
NSMutableArray* arr =[self mutableArrayValueForKey:@"selectedIndexPaths"]; 
if (arr) { 
    [arr addObject:object]; 
} 
} 

使用換的:

- (void)removeAllObjects{ 
    int count = [selectedIndexPaths count]; 
    for (int i=count-1;i>-1;i--) { 
     [self removeObjectFromSelectedIndexPathsAtIndex:i]; 
    } 
} 
+0

非常感謝你。我添加了一個觀察者,這似乎是確定的。但我不明白我必須實現checkchanges方法和更改數組方法嗎?另外,當我嘗試向數組添加某些內容時,我收到'收到但未處理的消息'錯誤。 :( – chrisnolten

+0

一切都是單一類的一部分(在我的情況下,它是ViewController) 對於開始,嘗試在'viewDidLoad'中添加觀察者,例如 'observeValueForKeyPath:'方法是KVO默認的,所以。把它放在你在你的類時調用此方法,其中系統接收關於對象的更改通知和這裏的陣列已經包含了變化 使用changesmthinarray的: ' - (無效)removeAllSelectedObjects { int count = [selectedIndexPaths count]; for(int i = count-1; i> -1; i--){self removeObjectFromSelectedIndexPathsAtIndex:i] ; } } ' – CheshireKat

0

簡單的解決方案:不要跟你的陣列,談談你的arraycontroller。取而代之的[array addObject:…][arrayController addObject:…],而不是從[array removeObject:…]做CheshireKat等[arrayController removeObject:…]

解決方案:

NSMutableArray *mutableArray = [self mutableArrayValueForKey:@"vocabList"]; 
for (NSObject* o in meaningsArray) 
{ 
    NSLog(@"%@",o); 

    Vocab *temp = [[Vocab alloc] init]; 

    [temp setValue:@"w" forKey:@"word"]; 
    [temp setValue:@"m" forKey:@"meaning"]; 

    [mutableArray insertObject:temp atIndex:[mutableArray count]]; 
} 

另一種解決辦法:如果你想整個整個數組,填充數組,並重新設置vocabList

NSMutableArray *mutableArray = [NSMutableArray array]; 
for (NSObject* o in meaningsArray) 
{ 
    NSLog(@"%@",o); 

    Vocab *temp = [[Vocab alloc] init]; 

    [temp setValue:@"w" forKey:@"word"]; 
    [temp setValue:@"m" forKey:@"meaning"]; 

    [mutableArray addObject:temp]; 
} 
self.vocabList = mutableArray;