Вопрос

У меня маленький NSTableView с флажком. Всякий раз, когда флажок не проверяется, я хочу один из соседних NSCellS должен быть серым и недоступным.

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

Как я могу получить доступ к одной одной ячейке?

Редактировать: Я заполняю взгляд таблицы, используя NSTableViewDataSource протокол.

Это было полезно?

Решение

Вы не «доступа к клетке». NSTableView Запрашивает данные только при необходимости, вы не заполните его или не контролируете его напрямую.

Вместо этого вы создаете объект контроллера, который реализует NSTableViewDatasource и необязательно NSTableViewDelegate протоколы. Затем поставку таблицы отправляет сообщения данных DataSource на ваш контроллер, и ваш контроллер подает соответствующие данные.

Вы можете разрешить редактирование для объекта, отображаемого в таблице представления, реализуя ‑tableView:setObjectValue:forTableColumn:row: Метод DataSource. Этот метод будет вызываться на объекте вашего контроллера, когда пользователь нажимает флажок. Это ответственность вашего контроллера за обновление модели соответствующим образом.

Когда модель обновляется, ваш контроллер должен сообщить обзору таблицы для перезагрузки. Затем представление таблицы спросит ваш контроллер для значения любой ячейки, требующего отображения с помощью ‑tableView:objectValueForTableColumn:row: Метод DataSource. Это будет включать клетку, которую вам нужно отключить. Ваш контроллер должен предоставить соответствующее значение для ячейки.

Если вам нужно больше контроля над ячейкой, вы можете реализовать‑tableView:willDisplayCell:forTableColumn:row: Способ делегата. Это называется незадолго до отображения ячейки, и вы можете изменять ячейку соответствующим образом.

Больше информации об использовании источников данных в Документы.

Другой вариант (вместо использования данных) - использовать привязки какао и NSArrayController Что вы связываете с вашей коллекцией объектов модели. В этом случае вы можете связать Enabled Привязка столбца таблицы к некоторому свойству вашего моделей объекта, которая управляет состоянием включенного ячейки. Ваша обязанность убедиться, что государство этого свойства является правильным.

Если вам нужно сделать свойство зависимым от значения другого свойства, вы можете использовать механизм зависимого ключа, изложенного в Наблюдение за ключом документация.

Другие советы

Можете ли вы привязать редактируемость этого столбца к значению, которое отображается в флажок? Т.е. если оно проверяется, это редактируемое, иначе это не так?

Я пытаюсь вспомнить точный интерфейс редактора, и я не рядом с моим Mac дома, поэтому я не могу сделать общую прогулку на нем - надеюсь, это может указать вам в правильном направлении.

С SDK версии 10.7, есть -viewAtColumn:row:makeIfNecessary: на NSTableView. Отказ Большинство информации, которую я нашел в Интернете, не принимает новые методы, поэтому здесь для всех остальных ищет ответ на этот вопрос.

От события мыши к выбору клеток

Сначала добавьте протокол для вашего контроллера для обработки выбора ячейки из табличного вида, как это:

@protocol XYZCellSelectionDelegate <NSObject>
- (void)cellViewWasSelectedAtRow:(NSInteger)row column:(NSInteger)column;
@end

Затем подкласс NSTableView и переопределить -mouseDown:

// In your Custom Table View subclass:
- (void)mouseDown:(NSEvent *)event
{
    NSPoint point = [self convertPoint:[event locationInWindow] fromView:nil];
    NSInteger selectedRowIndex = [self rowAtPoint:point];
    NSInteger selectedColumnIndex = [self columnAtPoint:point];

    if ([self.calendarViewDelegate respondsToSelector:@selector(cellViewWasSelectedAtRow:column:)])
    {
        [self.calendarViewDelegate cellViewWasSelectedAtRow:selectedRowIndex column:selectedColumnIndex];
    }

    [super mouseDown:event];
}

После этого вы можете использовать -viewAtColumn:row:makeIfNecessary: Вроде это в объекте делегата / контроллера:

- (void)cellViewWasSelectedAtRow:(NSInteger)row column:(NSInteger)column
{
    NSView *selectedView = [self.tableView viewAtColumn:column row:row makeIfNecessary:YES];

    // Do something with the cell to the right
    NSInteger nextColumn = column + 1;
    NSView *cellNextToIt = [self.calendarTableView viewAtColumn:nextColumn row:row makeIfNecessary:YES];

}

Примечание: В настоящее время я бы передал представление таблицы к делегату в качестве параметра вместо того, чтобы полагаться на делегат, чтобы содержать ссылку на представление таблицы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top