Проблема обновления / перезагрузки NSTableView - PullRequest
0 голосов
/ 23 августа 2011

Я новичок в какао. У меня есть приложение какао, которое содержит NSTableView с текстовым столбцом и поле предварительного просмотра NSTextView, которое показывает текст выбранной строки.

  1. Я не использую привязки
  2. Делегат и источник данных установлены правильно
  3. В таблице используется NSMutableArray из MyObject's

Теперь я могу успешно добавлять или удалять строки. Я могу изменить выделение, и соответствующий выделенный текст появляется в UITextView.

Проблема: как только я использую NSTextView для изменения / редактирования значения любой строки / столбца, NSTableView мешает моему NSMutableArray и показывает неверные данные. После этого изменение выбора показывает разные состояния в табличном представлении. Смотрите прикрепленные снимки экрана.

Состояние 1: (Отображение заполненных данных)

State 1

Состояние 2: (выбор строки изменен)

State 2

Состояние 3: (выбор строки изменен)

State 3

Состояние 4: (собирается редактировать значение!)

State 4

Состояние 5: (выделение / выбор строки № 1)

State 5

Состояние 6: (выделение / выбор строки № 2)

State 6

Я использую следующий метод для получения обновленного значения из UITextView:

- (void)textDidEndEditing:(NSNotification *)notification {
    id sender = [notification object];
    NSString * theString = [sender string];

    NSInteger selectedRow = [_myTableView selectedRow];

    if (selectedRow < 0 || selectedRow > [_myArray count] - 1) return;

    MyObject *rowObject = [_myArray objectAtIndex:selectedRow];
    rowObject.text = theString;

    // Update table
    [_myTableView reloadData];
}

Я пытался реализовать обходной путь для явной ошибки перезагрузки в NSTableView, но у меня это не работает:

- (void)tableViewSelectionIsChanging:(NSNotification *)notification {

    if ([notification object] == _myTableView) {
        [_myTableView noteNumberOfRowsChanged];
    }
}

Я ценю любую помощь в определении источника проблемы.

1 Ответ

0 голосов
/ 24 августа 2011

Потратив бесчисленное количество часов, я наконец смог решить проблему.Изменение, внесенное в textDidEndEditing: метод, выглядит так:

- (void)textDidEndEditing:(NSNotification *)notification {
    id sender = [notification object];
    NSString * theString = [sender string];

    NSInteger selectedRow = [_myTableView selectedRow];

    if (selectedRow < 0 || selectedRow > [_myArray count] - 1) return;

    MyObject *rowObject = [_myArray objectAtIndex:selectedRow];

    // Problematic!
    // rowObject.text = theString;

    // Working!
    rowObject.text = [NSString stringWithString:theString];

    // Update table
    [_myTableView reloadData];
}
...