2017-01-17 3 views
0

The documentation for the NSTableViewDataSource protocol говоритЦель Tableview (_: objectValueFor: строка :)

Этот метод является обязательным

и если вы создаете новый NSTableViewDataSource компилятор просит вас предоставить этот метод, а также numberOfRows(in tableView: NSTableView).

До сих пор так хорошо. И если вы его предоставите, он сразу же будет вызван один раз для каждой строки ... но если вы его удалите, таблица, похоже, будет работать каждый бит так же, как и без него. Кажется, что в таблице, основанной на представлении, нет такого соединения: в методе NSTableViewDelegate tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) я возвращаю новые представления на основе массива содержимого моего источника данных, и если я вставлю кучу бессмысленных данных в objectValueFor: row (до и включая возврат одной и той же строки - мои объекты таблицы не являются строками) не имеет никакого эффекта, потому что я устанавливаю значения моего NSTableViewCells в viewFor tableColumn:.

Если я обработка изменения выбора (и все, что я хочу сделать с объектами), извлекая соответствующее значение из источника данных непосредственно (например)

func tableViewSelectionDidChange(_ notification: Notification) { 
print(dataSource.allItems[tableView.selectedRow]) 
} 

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

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

+0

Смотреть [«Основанный на представлении NSTableView Basic to Advanced» от WWDC 2011] (https://developer.apple.com/videos/play/wwdc2011/120/). Это очень полезно для понимания табличных представлений на основе представлений и обсуждает метод tableView: objectValueForColumn: row: 'в этом контексте. Вы можете найти расшифровку сессии [здесь] (https://raw.githubusercontent.com/mayoff/wwdc-session-transcripts/86448e088823690110f1a7e98d2475781ff0c0fd/2011/120.vtt). –

+0

Спасибо - я наблюдал это некоторое время назад, и соответствующий бит проскользнул мимо меня: «Необязательный метод - tableView: objectValueForTableColumn: row :. Раньше это требовалось с помощью NSCell, потому что оно было настроено на NSCell но теперь это необязательно », что прямо противоположно уведомлению компилятора и документации :-( –

ответ

2

Если вид клетки отвечает setObjectValue:, то представление таблицы вызывает этот метод и проходит в значении объекта для строки, которая была получена от tableView(_:objectValueFor:row:).

NSTableCellView действительно отвечает на этот метод и является общим классом ячеек. NSTextField, тоже; он наследует его от NSControl.

В вашем случае ваш вид сотовой ячейки либо не имеет свойства objectValue, либо, скорее всего, вы просто не используете его.

Одной из общих конфигураций является использование NSTableCellView в качестве вида ячеек, а затем использование привязок для привязки подзонов к путям ключей, проходящим через его свойство objectValue.

+0

Спасибо, это было очень полезно. Я ранее устанавливал представленный объект NSTableCellView в viewForTableColumn и использовал привязки для этого: это приятно способ хранения dataSource и делегирования отдельно. (Несмотря на то, что я смотрю на множество примеров, я не думаю, что когда-либо видел его.) И я не установил связь между objectValue и StringValue, IntegerValue и т. Д. ... –

Смежные вопросы