在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