Получение содержимого ячейки из NSOutlineView - PullRequest
1 голос
/ 19 августа 2011

У меня возникла странная проблема с NSOutlineView.Представление представляет собой список приложений со связанными файлами как дочерние.Я заполняю представление вручную в его источнике данных, и все это прекрасно работает.То, что я сейчас хочу сделать, это кнопка для удаления элемента.Для этого я реализовал метод removeAppOrFile, например, так:

- (IBAction)removeAppOrFile:(id)sender
{
    NSInteger selectedRow = [myView selectedRow];
    if (selectedRow == -1) //ie. nothing's selected
    {
        return;
    }  
    NSTableColumn *col = [myView tableColumnWithIdentifier:@"Column 1"];
    NSCell *cell = [col dataCellForRow:selectedRow];
    NSString *item = [cell stringValue];
    NSLog(@"The row is: %ld\nThe column is: %@\nThe cell is: %@\nThe selected item is: %@",selectedRow, col, cell, item); // For testing purposes
}

myView - это IBOutlet, подключенный к моему NSOutlineView.Если я выберу другую строку и нажму кнопку, значение selectedRow изменится должным образом, но объект NSCell никогда не изменится, и каким должно быть его значение (т. Е. NSString item), всегда будет показано значение последнего видимого элемента (т. Е. Если естьэлемент с потомками в качестве последнего элемента Элемент NSString будет родительским, если он не раскрыт, или последним дочерним, если он развернут).

Странная вещь заключается в том, что я использую в основном тот же код в другом месте для doubleActionна NSOutlineView, и он работает отлично.В этом случае код выглядит следующим образом:

- (void)editedAppOrFile:(id)sender 
{
    NSInteger rowNumber = [sender clickedRow];
    NSTableColumn *col = [sender tableColumnWithIdentifier:@"Column 1"];
    NSCell *cell = [col dataCellForRow:rowNumber];
    NSString *item = [cell stringValue];
    NSLog(@"The row is: %ld\nThe column is: %@\nThe cell is: %@\nThe selected item is: %@",selectedRow, col, cell, item); // For testing purposes
}

В этом случае отправителем является outlineView.изменение элемента и ячейки с изменением rowNumber.

Есть идеи, почему это не работает в первом примере?

1 Ответ

3 голосов
/ 19 августа 2011

Есть несколько проблем с вашим подходом.

  1. Вы получаете ячейку данных, а не -preparedCellAtColumn:row:, поэтому у вас нет никаких гарантий относительно того, каким будет значение ее внутреннего объекта.
  2. Вы можете задать вид структуры непосредственно для -itemAtRow:.
  3. Если вы пытаетесь удалить (в первом случае) или отредактировать (во втором случае), вам действительно нужно только изменить свой источник данных и затем записать количество измененных строк (первый случай) или перезагрузить данные для строки ( второй случай).
...