以编程方式向NSTableView添加列

3

我在IB中创建了一个NSTableView,包含3列(名字、姓氏和电子邮件)。我想添加第四列(年龄)。

    let column = NSTableColumn(identifier: NSUserInterfaceItemIdentifier(rawValue: "age"))
    column.title = "Age"
    column.width = CGFloat(120)
    column.minWidth = CGFloat(4)
    self.tableView.addTableColumn(column)

这一列已经添加,但内容为空。

我想知道是否存在单元格视图的问题,但不知道如何添加它。有人可以帮忙吗?

谢谢。

以下是完整代码。代码使用Swift 4 Xcode 9编写。

import Cocoa

class Person: NSObject {
var firstName : String
var lastName : String
var emailId : String
var age : Int

init(firstName: String, lastName: String, emailId: String, age: Int){
    self.firstName = firstName
    self.lastName = lastName
    self.emailId = emailId
    self.age = age
}
}

class ViewController: NSViewController {

@IBOutlet weak var tableView: NSTableView!

var tableViewData: [Person] = [Person(firstName: "John", lastName: "Apple", emailId: "d.v@stack.com", age: 35),Person(firstName: "Phil", lastName: "Grant", emailId: "dg@yo.com", age: 50),Person(firstName: "lou", lastName: "groth", emailId: "AV@flock.com", age: 14)]

override func viewDidLoad() {
    super.viewDidLoad()

    let column = NSTableColumn(identifier: NSUserInterfaceItemIdentifier(rawValue: "age"))
    column.title = "Age"
    column.width = CGFloat(120)
    column.minWidth = CGFloat(4)
    self.tableView.addTableColumn(column)

    self.tableView.delegate = self
    self.tableView.dataSource = self
    self.tableView.reloadData()
}
}

extension ViewController:NSTableViewDataSource, NSTableViewDelegate{

func numberOfRows(in tableView: NSTableView) -> Int {
    return tableViewData.count
}

func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView?{
    guard let vw = tableView.makeView(withIdentifier: tableColumn!.identifier, owner: self) as? NSTableCellView else { return nil }

    switch tableColumn?.identifier.rawValue  {
    case "firstName"?:
        vw.textField?.stringValue = tableViewData[row].firstName
    case "lastName"?:
        vw.textField?.stringValue = tableViewData[row].lastName
    case "emailId"?:
        vw.textField?.stringValue = tableViewData[row].emailId
    case "age"?:
        vw.textField?.integerValue = tableViewData[row].age
    default:
        return nil
    }
    return vw
}
}
2个回答

2
使用标识符属性。
let tableColumn = NSTableColumn()
tableColumn.headerCell.title = "Age"
tableColumn.headerCell.alignment = .center
tableColumn.identifier = "age"
self.tableView.addTableColumn(tableColumn)

感谢您的评论。我以为标识符是通过let列传递的...我仍然尝试了您的建议,但标识符不接受字符串。正确的语法是tableColumn.identifier = NSUserInterfaceItemIdentifier("age")。但即使这样,问题仍然存在。 - Dids

1
我知道这已经过时了,但是有人可能会发现这很有用。makeView的文档说:
如果无法从nib文件中实例化具有指定标识符的视图或在重用队列中找到,则此方法返回nil。
如果您以编程方式添加列,则它不会出现在nib中,因此makeView将返回nil,而您的列将为空。要使其显示,您可以像这样使用NSTextField而不是NSTableCellView:
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView?
{
    var vw = tableView.makeView(withIdentifier: tableColumn!.identifier, owner: self) as? NSTextField

    if vw == nil
    {
        vw = NSTextField(labelWithString: "")
        vw?.identifier = tableColumn!.identifier // allows this new cell to be reused
    }

    switch tableColumn?.identifier.rawValue  {
    case "firstName":
        vw?.stringValue = tableViewData[row].firstName
    case "lastName":
        vw?.stringValue = tableViewData[row].lastName
    case "emailId":
        vw?.stringValue = tableViewData[row].emailId
    case "age":
        vw?.stringValue = String(tableViewData[row].age)
    default:
        return nil
    }

    return vw
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接