2013-03-20 2 views
2

Моя проблема заключается в обновлении NSMutableArray, который содержит различное количество NSDictionary. Каждый NSDictionary имеет 6 ключей, которые извлекаются из базы данных в зависимости от того, какую запись пользователь выбрал в виде таблицы. Массив связан с NSArrayController, который позволяет пользователю выбирать словарь и просматривать содержимое.Обновления, совместимые с KVC для NSMutableArray, содержащие NSDictionary's

Если число [count] словарей изменяется, arrayController обновляет представление; без проблем. Однако количество словарей одинаково между выборами в представлении таблицы, arrayController не обновляет представление, но модель обновляет.

МассивController связан в IB с массивом модели, который обновляется всякий раз, когда выбор изменяется в виде таблицы.

Использование:

[self.selectedJobNotes addObject:[self.jobNotes objectAtIndex:i]]; 

который не КВЦ требованиям.

Однако использование (который я считаю KVC податливого):

[[self.selectedJobNotes objectAtIndex:noteCount] setValue:[[self.jobNotes objectAtIndex:i]valueForKey:@“Content"] forKeyPath:@"Content"]; 

не работает.

Есть ли способ сообщить ArrayController, что это новый массив/имеет свежий контент, поэтому перезагрузите.

[self.jobNotesArrayController fetch:self.a2gDataObject.selectedJobNotes]; 

Кажется, что не работает? ??

ответ

1

Лучший способ решить эту задачу - реализовать (и использовать) индексированные аксессоры. В вашем случае они выглядят как

- (void)insertObject:(NSDictionary *)dict inSelectedJobNotesAtIndex:(NSUInteger) index { 
    [self.selectedJobNotes addObject:[self.jobNotes objectAtIndex:index]]; 
} 


- (void)insertSelectedJobNotes:(NSArray *)notesArray atIndexes:(NSIndexSet *)indexSet { 
    [self.selectedJobNotes insertObjects:notesArray atIndexes:indexSet]; 
} 

См Руководство по программированию КВЦ: Mutable Indexed Accessors и Ensuring KVC Compliance.

Вы также можете обернуть свои обновления в willChange/didChange ValueForKey:, но внедрение индексированных аксессуаров решает его раз и навсегда.

+0

Спасибо за ответ. Я отдам его. В то же время, просто отменил реферирование массива, а затем создал новый. selectedJobNotes = nil; Неуклюжий и, вероятно, неправильный способ сделать это, но он работал на короткий срок. Я попытаюсь реализовать эти методы. Я думаю, что попробовал willChange/didChange, но они не сработали. Возможно, неправильно реализовано. – Steve

+0

Реализованы эти методы, но мне еще нужно уничтожить и воссоздать массив, чтобы получить желаемый результат. Вероятно, все еще делаю это лучше, чем раньше. – Steve

 Смежные вопросы

  • Нет связанных вопросов^_^