Очень странное поведение Core Data и NSArrayController - PullRequest
0 голосов
/ 22 мая 2011

У меня есть основанное на документе приложение на базе Core Data с хранилищем в памяти. У меня есть таблица, поддерживаемая NSArrayController, которая должна перечислить все объекты модели типа Buffer. Мой пользовательский интерфейс также включает NSTextView, который извлекает данные из выбранного в данный момент объекта Buffer.

Я пытаюсь заполнить текстовое представление таким образом (я использую Fragaria):

- (void)tableViewSelectionDidChange:(NSNotification *)aNotification
{
    if ([aNotification object] == editorList) {
        Buffer *buffer = [[editorListArrayController selectedObjects] objectAtIndex:0];
        [fragaria setString:[buffer valueForKey:@"content"]];
    }
}

Теперь, когда пользователь вводит что-то в текстовое представление, я сохраняю это в выбранном в данный момент буфере, а затем сохраняю изменения в контексте управляемого объекта:

- (void)textDidChange:(NSNotification *)notification
{
    Buffer *buffer = [[editorListArrayController selectedObjects] objectAtIndex:0];
    [buffer setValue:[fragaria string] forKey:@"content"];
    [[self managedObjectContext] saveChanges];
    [self setEditedFlagForModelAndWindow:YES];
}

Моя проблема в том, что когда я перечисляю все объекты модели в моем NSArrayController, они все, кажется, имеют одинаковое значение для @ "content", что означает, что одно и то же значение каким-то образом записывается во все объекты модели. Как я могу отладить это?

1 Ответ

1 голос
/ 23 мая 2011

К счастью, у меня была та же самая проблема некоторое время назад.

Проблема в вашем назначении:

[buffer setValue:[fragaria string] forKey:@"content"];

[строка fragaria] возвращает указатель на изменяемую строку. Каждое редактирование в вашем NSTextView обновляет один и тот же объект NSMutableString, в результате чего все объекты буфера изменяются без уведомления.

Работает следующий код:

NSString *result = [NSString stringWithFormat:@"%@", [fragaria string]];
[buffer setValue:result forKey:@"content"];

Также может быть достаточно [NSString stringWithString:], но я еще не проверял это.

...