2

Во-первых: Я читал вопросы, связанные с этой проблемой несколько раз здесь, и я публикую это с осознанием того, что люди могут считать это дублирующимся вопросом. Но я должен сказать, что, будучи новичком, я не нашел полезной информации, поэтому я с этим вопросом надеюсь сделать вещи очень ясными как для меня, так и для других.Как использовать mutableArrayValueForKey для KVO?

Как я понимаю Наручники & КВЦ/КВО

Рассмотрим это: У меня есть массив (в моем AppDelegate), ArrayController и вид элемента, скажем, NSTableView. Я связал NSMutableArray в своем AppDelegate с 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 в своем массиве и наблюдать за изменениями, вы должны внести изменения в изменяемый прокси для этого массива, а не в самом массиве. 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 и методы changemthinarray? также, когда я пытаюсь добавить что-то в массив, я получаю сообщение «сообщение было получено, но не обработано». :( – chrisnolten

+0

все это часть одного класса (в моем случае это было ViewController) Для начала, попробуйте добавить наблюдателя в 'viewDidLoad', например ' observeValueForKeyPath:.. 'Метод по умолчанию для КВО, так .. положить его где-то в вашем в вашем классе Этот метод вызывается, когда система получения уведомления об изменении объекта А вот, массив уже содержит изменения использование 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:…] сделать [arrayController removeObject:…] и т.д.

Решение от CheshireKat:

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; 
Смежные вопросы