以编程方式将列添加到NSTableView

时间:2018-01-25 08:07:15

标签: swift macos cocoa swift4

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

    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 个答案:

答案 0 :(得分:1)

使用标识符属性。

let tableColumn = NSTableColumn()
tableColumn.headerCell.title = "Age"
tableColumn.headerCell.alignment = .center
tableColumn.identifier = "age"
self.tableView.addTableColumn(tableColumn)

答案 1 :(得分:0)

我知道这很老了,但有人可能会觉得有帮助。 makeView的文档显示:

  

如果无法从nib文件实例化或在重用队列中找到具有指定标识符的视图,则此方法返回nil。

如果以编程方式添加列,则该列将不在笔尖中,因此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
}