更新了NSTableCellView.textField未在表格显示中更新.

Roj*_*jer 2 cocoa textfield nstablecellview

我有一种感觉,这个表格细胞显示问题有一个简单的答案但是,我显然需要比我更大的智慧才能找到它.

这是我的教科书控制器,表的委托和数据源类以及封闭视图......

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
    }
}
Run Code Online (Sandbox Code Playgroud)

我将更新记录到.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
Run Code Online (Sandbox Code Playgroud)

但实际的表格显示保留了原始界面构建器值!'表格查看单元格'在"返回结果"之后出现了一些神秘的东西.

我正在使用最新的Xcode版本6.3(6D570)和Swift V1.2

Pau*_*son 6

你犯了几个错误.

首先,你将从中返回错误的价值tableView:objectValueForTableColumn:row.此方法不请求视图实例,它正在请求视图实例将表示的对象.换句话说,它想知道视图将显示的模型对象.在每种情况下,您的模型对象都非常简单 - 它是数组中的一个字符串.tokenText

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

其次,你没有实现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
}
Run Code Online (Sandbox Code Playgroud)

  • 在这个简单的例子中,你不需要实现``tableView:objectValueForTableColumn:row:`` - 你可以删除它,你的应用程序将构建和运行没有任何问题.在更复杂的例子中,``NSTableCellView``的``objectValue``属性更重要.我正在考虑使用*bindings*填充表视图的时间.如果你这样做,你会看到一切都可以通过*Interface Builder*完成,以及你告诉``NSTableCellView`控件的方式,他们应该显示的模型部分是通过这个视图的``objectValue ``. (3认同)