2015-04-14 2 views
1

У меня такое ощущение, что проблема с отображением ячейки таблицы имеет простой ответ, но я явно нуждаюсь в большей мудрости, чем моя, чтобы найти ее.Обновлен NSTableCellView.textField НЕ обновлен в режиме отображения таблицы.

Вот мой контроллер учебника, делегат и класс DataSource для таблицы и вида ограждающего ...

import Cocoa 

class Table8020ViewController: NSViewController, NSTableViewDelegate, NSTableViewDataSource { 

    var tokenText: [String] = ["alpha", "beta", "gamma", "delta", "epsilon", "zeta"] 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    func numberOfRowsInTableView(aTableView: NSTableView) -> Int { 
     println("numberOfRowsInTableView = \(tokenText.count)") 
     return tokenText.count 
    } 

    func tableView(aTableView: NSTableView, objectValueForTableColumn aTableColumn: NSTableColumn?, row rowIndex: Int) -> AnyObject? { 

     var result = aTableView.makeViewWithIdentifier(aTableColumn!.identifier, owner: self) as! NSTableCellView 
      println("textField in = \(result.textField!.stringValue)") 

      result.textField!.stringValue = tokenText[rowIndex] 

      println("textField out = \(result.textField!.stringValue)") 
      return result 
    } 
} 

Я вхожу обновление в .textField, который, кажется, работает нормально.

numberOfRowsInTableView = 6 
textField in = Table View Cell 
textField out = alpha 
textField in = Table View Cell 
textField out = beta 
textField in = Table View Cell 
textField out = gamma 
textField in = Table View Cell 
textField out = delta 
textField in = Table View Cell 
textField out = epsilon 
textField in = Table View Cell 
textField out = zeta 

Но фактический дисплей таблицы сохраняет исходные значения конструктора интерфейса! «Table View Cell» Что-то загадочное, похоже, происходит после «результата возвращения».

Я использую последний Xcode версии 6.3 (6D570) с Swift V1.2

ответ

5

Вы делаете пару ошибок.

Во-первых, вы возвращаете неправильный вид от tableView:objectValueForTableColumn:row. Этот метод не запрашивает экземпляр представления, он запрашивает объект, что ваш экземпляр вашего представления будет , представляющий. Другими словами, он хочет знать, что модель объект вид будет отображаться. В каждом случае ваш объект модели очень прост - это одна из строк в массиве tokenText.

func tableView(tableView: NSTableView, 
    objectValueForTableColumn tableColumn: NSTableColumn?, 
    row: Int) -> AnyObject? { 
     return tokenText[row] 
} 

Во-вторых, вы не смогли реализовать tableView:viewForTableColumn:row:. Здесь вы создаете представление для каждой ячейки в своей таблице и указываете, какие биты объекта модели вы хотите отобразить. В каждом случае ваша объектная модели просто строка, так что вы по существу сказать виду, чтобы отобразить весь объект модели в ее textField:

func tableView(tableView: NSTableView, 
    viewForTableColumn tableColumn: NSTableColumn?, 
    row: Int) -> NSView? { 

     var view = tableView.makeViewWithIdentifier(tableColumn!.identifier, 
      owner: self) as! NSTableCellView 
     view.textField!.stringValue = tokenText[row] 

    return view 
} 
+0

Спасибо за быстрый и ясный ответ. Проблема решена. Теперь размышляя над моей путаницей ... ПОЧЕМУ это «objectValue» обязательной важности? Я предполагаю, что это может быть любой объект, такой же простой, как мой пример «String», или довольно сложный, как сказать «InvestmentPortfolio». Помимо сохранения указателя на объект, таблица не может ничего делать с такой штукой или может ли она? – Rojer

+2

В этом простом примере вам не нужно реализовывать '' tableView: objectValueForTableColumn: row: '' - вы можете удалить его, и ваше приложение будет создавать и запускать без каких-либо проблем. Однако в более сложных примерах значение '' objectValue' '' 'NSTableCellView' является более важным. Я думаю, в частности, когда вы заполняете табличный вид, используя * bindings *. Если вы расскажете об этом, вы увидите, что все можно сделать с помощью * Interface Builder * и способом, которым вы указываете элементы управления в '' NSTableCellView', какую часть модели, которую они должны отображать, - это «objectValue» этого представления ''. –

+0

Отлично. Все это имеет смысл. Ваш вклад в мою растущую мудрость очень ценится. – Rojer

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