Условные значения столбца в NSTableView? - PullRequest
0 голосов
/ 19 мая 2010

У меня есть NSTableView, который связывается через NSArrayController с NSMutableArray. В массиве находятся производные классы; первые несколько столбцов таблицы связаны со свойствами, существующими в базовом классе. Это все отлично работает.

Где я сталкиваюсь с проблемой - это столбец, который должен быть заполнен, только если строка соответствует одному конкретному подклассу. Свойство, которое должен отображать этот столбец, существует только в этом подклассе, поскольку оно не имеет смысла с точки зрения базового класса. Из первых двух столбцов пользователь будет знать, почему ячейка третьего столбца заполнена / доступна для редактирования или нет.

Привязка к значению третьего столбца находится на устройствах selectedObject с указанием пути к модели, например, «foo.name», где foo - это свойство подкласса. Однако это не работает, так как другие подклассы в иерархии не соответствуют ключу-значению для foo.

Кажется, что мой единственный выбор - это иметь свойство foo в базовом классе, чтобы все отвечали на него, но это загромождает интерфейсы объектов модели.

Кто-нибудь придумал чистый дизайн для этой ситуации? Это не может быть редкостью (я относительный новичок в Какао, и я просто изучаю все тонкости привязок.)

1 Ответ

1 голос
/ 01 июня 2010

Один из способов решить эту проблему - использовать привязки только для первых двух столбцов, в которых он работает. Для остальных столбцов вы реализуете NSTableViewDataSource, который реализует необходимую пользовательскую логику.

Сначала создайте новый класс, который реализует

-tableView:objectValueForTableColumn:row:
-tableView:setObjectValue:forTableColumn:row:

(2-й нужен только в том случае, если пользователь должен редактировать другие столбцы). Затем добавьте

IBOutlet NSArrayController *valuesController;

переменная экземпляра для этого класса.

Внутри Interface Builder добавьте новый объект этого класса (перетащите синий кубик «объект» в окно файла из библиотеки). Подключите контроллер массива к новому источнику данных. Затем соедините источник данных с табличным представлением, чтобы сделать его источником данных табличного представления.

Убедитесь, что столбцы после первых двух не связаны ни с чем.

The

-tableView:objectValueForTableColumn:row:

метод будет вызываться для этих столбцов по мере необходимости, и вы можете смотреть на объект по мере необходимости:

- (id)tableView:(NSTableView *)aTableView
   objectValueForTableColumn:(NSTableColumn *)aTableColumn
                         row:(NSInteger)rowIndex;
{
    NSObject *myObject = [[valuesController arrangedObjects] objectAtIndex:rowIndex];
    id columnIdentifier = [aTableColumn identifier];
    if ([columnIdentifier isEqual:@"foo"]) {
        if ([myObject respondsToSelector:@selector(fooValue)]) {
            return [myObject fooValue];
        }
    }
    return nil;
}

Обратите внимание, как я использую идентификатор столбца, чтобы увидеть, какой столбец запрашивается. Установите идентификатор столбцов в Интерфейсном Разработчике.

...