在Swift 5中使用模型的简单NSTableView – Szabolcs Toth –中

在本教程中,我们将使用Person模型创建一个简单的基于视图的NSTableView。

因此,最终将是:

步骤1.创建一个Cocoa Application项目。

步骤2.将NSTableView添加到Main Storyboard并进行一些自定义

  • 将列数从2增加到3。
  • 单击标题并命名列
  • 我们需要向列和单元格添加标识符。

您还应该在“姓氏(lastName)”和“手机号码(mobileNumber)”列以及单元格中重复此操作。

创建一个IBOutlet并将其连接到您的表视图,但是不要忘记dataSource和委托。

@IBOutlet var tableView: NSTableView! 

因此,我们添加了一个新文件,而不是使用Dictionary创建数组。

 import Cocoa 

struct Person {
let firstName: String
let lastName: String
let mobileNumber: String
}

我们有Person模型,我们需要向其中添加一些值,但首先要创建一个数组。

 @IBOutlet var tableView: NSTableView! 
var people: [Person] = []
 override func viewDidLoad() { 
super.viewDidLoad()

let person1 = Person.init(firstName: "Ragnar", lastName: "Lothbrok", mobileNumber: "555-1234")
let person2 = Person.init(firstName: "Bjorn", lastName: "Lothbrok", mobileNumber: "555-3412")
let person3 = Person.init(firstName: "Harald", lastName: "Finehair", mobileNumber: "555-4512")
people.append(person1)
people.append(person2)
people.append(person3)
}

我们需要实现以下两种方法:

  • 我们需要多少行?

numberOfRows(in tableView: NSTableView) -> Int

  • 以及单元格的值是什么

tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView?

将委托与作为扩展的主要代码分开是一种很好的做法,因此以下内容不会直接添加到ViewController

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

我们想将NSDictionary键与列标识符匹配,并将NSDictionary值提供给单元格。

 func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? { 
let person = people[row]

guard let cell = tableView.makeView(withIdentifier: tableColumn!.identifier, owner: self) as? NSTableCellView else { return nil }

if (tableColumn?.identifier)!.rawValue == "firstName" {
cell.textField?.stringValue = person.firstName
} else if (tableColumn?.identifier)!.rawValue == "lastName" {
cell.textField?.stringValue = person.lastName
} else {
cell.textField?.stringValue = person.mobileNumber
}

return cell
}

NSDictionary键必须与列的标识符匹配非常重要,否则它将不起作用。

我在下面复制完整的代码。

 Import Cocoa 

class ViewController: NSViewController {

@IBOutlet var tableView: NSTableView!
var people: [Person] = []

override func viewDidLoad() {
super.viewDidLoad()

let person1 = Person.init(firstName: "Ragnar", lastName: "Lothbrok", mobileNumber: "555-1234")
let person2 = Person.init(firstName: "Bjorn", lastName: "Lothbrok", mobileNumber: "555-3412")
let person3 = Person.init(firstName: "Harald", lastName: "Finehair", mobileNumber: "555-4512")
people.append(person1)
people.append(person2)
people.append(person3)
}
}

extension ViewController: NSTableViewDataSource, NSTableViewDelegate {

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

func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
let person = people[row]

guard let cell = tableView.makeView(withIdentifier: tableColumn!.identifier, owner: self) as? NSTableCellView else { return nil }

if (tableColumn?.identifier)!.rawValue == "firstName" {
cell.textField?.stringValue = person.firstName
} else if (tableColumn?.identifier)!.rawValue == "lastName" {
cell.textField?.stringValue = person.lastName
} else {
cell.textField?.stringValue = person.mobileNumber
}

return cell
}
}

源代码:Github