#tableview #swift #cell
#просмотр таблицы #swift #ячейка
Вопрос:
У меня есть NSTableView, ячейки которого основаны на представлении.
Источник данных и делегат подключены, но я не могу отобразить строковое значение текстового поля ячейки.
Это код в Objective-C, работающий:
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
return 10;
}
- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
NSTableCellView *cell = [tableView makeViewWithIdentifier:@"List" owner:self];
[cella.textField setStringValue:"Hey, this is a cell"];
return cell;
}
А вот мой код в Swift, который не работает :
func numberOfRowsInTableView(aTableView: NSTableView!) -> Int
{
return 10 //Casual number
}
func tableView(tableView: NSTableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> NSTableCellView! {
var cell = tableView.makeViewWithIdentifier("List", owner: self) as NSTableCellView!
// setup cell without force unwrapping it
cell.textField.stringValue = "Hey, this is a cell"
println("Method called") //Never printed
return cell
}
Вот результат: (таблица в правой части изображения)
Обратите внимание, что комментарий //setup cell without force unwrapping it
не имеет никакого смысла, я забыл его удалить.
Чего мне не хватает?
Редактировать: я попробовал даже следующее, но безуспешно:
func numberOfRowsInTableView(aTableView: NSTableView!) -> Int
{
return 10
}
func tableView(tableView: NSTableView!, objectValueForTableColumn tableColumn: NSTableColumn!, row: Int) -> AnyObject
{
var cell = tableView.makeViewWithIdentifier("List", owner: self) as NSTableCellView
cell.textField.stringValue = "Hey this is a cell"
return cell;
}
Спасибо вам всем.
Alberto
Комментарии:
1. в коде Objective-C у вас есть
tableView:viewForTableColumn:row:
, а в Swift у вас естьtableView(tableView, cellForRowAtIndexPath)
. Конечно, естьtableView:viewForTableColumn:row:
эквивалент Swift?
Ответ №1:
После нескольких часов поиска я обнаружил этот метод, который работает!
func tableView(tableView: NSTableView, viewForTableColumn: NSTableColumn, row: Int) -> NSView
{
var cell = tableView.makeViewWithIdentifier("List", owner: self) as NSTableCellView
cell.textField.stringValue = "Hey, this is a cell"
return cell;
}
Ответ №2:
Я вижу, что вы сами нашли свой ответ, но, насколько я вижу, ваша подсказка заключалась в возвращаемом значении делегата Objective -C.
- (NSView *)tableView:...
Возвращаемое значение — это NSView.
Но вам следует взглянуть на документацию Swift / Objective -c.
Из документов:
Предоставление представлений для строк и столбцов TableView:viewForTableColumn:строка:
Asks the delegate for a view to display the specified row and column. Declaration SWIFT @optional func tableView(_ tableView: NSTableView!, viewForTableColumn tableColumn: NSTableColumn!, row row: Int) -> NSView! OBJECTIVE-C - (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
Обратите внимание на -> NSView! также в коде swift.
Новые документы позволяют просматривать код для Swift и Objective -c бок о бок или один или другой. Вы можете использовать вкладку выбора в верхней части документации для выбора.
Также похоже, что ваш код должен включать «!» для опций
Комментарии:
1. Спасибо за ваш ответ, это действительно помогло мне 🙂
Ответ №3:
Если вы измените режим содержимого табличного представления с view based на cell based, вызывается метод.
Ответ №4:
Это избило меня на час. Работает с Swift 2.2, вероятно, не будет работать для более ранних или более поздних версий:
let cell = tableView.makeViewWithIdentifier(myid!, owner: nil) // You can't cast this with as! like they want you to
if let mycell = cell as? NSTableCellView {
mycell.textField?.stringValue = text
return mycell
}