NSTableView на основе просмотра в Swift — Как

#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 не имеет никакого смысла, я забыл его удалить.

Код   Результат
Настройки TableVie
Делегат и подключенный источник данных

Чего мне не хватает?

Редактировать: я попробовал даже следующее, но безуспешно:

 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
    }