我在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
}
}
答案 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
}