如何使用 NSTableViewDiffableDataSource 通过 NSTableView 加载数据

Posted

技术标签:

【中文标题】如何使用 NSTableViewDiffableDataSource 通过 NSTableView 加载数据【英文标题】:How to Use NSTableViewDiffableDataSource to Load Data with NSTableView 【发布时间】:2022-01-12 03:36:34 【问题描述】:

我正在尝试学习如何使用NSTableViewDiffableDataSource 通过NSTableView 加载数据。我可以使用UITableViewDiffableDataSourceUICollectionViewDiffableDataSourceios 中加载数据,因为我在网上找到了一些示例。但我无法在 Cocoa 中使用NSTableViewDiffableDataSource

在下面的例子中,我有一个名为 TestTableCellViewNSTableCellView 子类,它显示三个字段:名字、姓氏和他或她的出生日期(字符串形式)。

import Cocoa

class ViewController: NSViewController 
    // MARK: - Variables
    var dataSource: NSTableViewDiffableDataSource<Int, Contact>?
    
    
    // MARK: - IBOutlet
    @IBOutlet weak var tableView: NSTableView!
    
    
    // MARK: - Life cycle
    override func viewWillAppear() 
        super.viewWillAppear()
        
        let model1 = Contact(id: 1, firstName: "Christopher", lastName: "Wilson", dateOfBirth: "06-02-2001")
        let model2 = Contact(id: 2, firstName: "Jen", lastName: "Psaki", dateOfBirth: "08-25-1995")
        let model3 = Contact(id: 3, firstName: "Pete", lastName: "Marovich", dateOfBirth: "12-12-2012")
        let model4 = Contact(id: 4, firstName: "Deborah", lastName: "Mynatt", dateOfBirth: "11-08-1999")
        let model5 = Contact(id: 5, firstName: "Christof", lastName: "Kreb", dateOfBirth: "01-01-2001")
        let models =  [model1, model2, model3, model4, model5]
        
        dataSource = NSTableViewDiffableDataSource(tableView: tableView, cellProvider:  tableView, tableColumn, row, identifier in
            let cell = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "cell"), owner: self) as! TestTableCellView
            let model = models[row]
            cell.firstField.stringValue = model.firstName
            cell.lastField.stringValue = model.lastName
            cell.dobField.stringValue = model.dateOfBirth
            return cell
        )
        tableView.dataSource = dataSource
        guard let dataSource = self.dataSource else 
            return
        
        var snapshot = dataSource.snapshot()
        snapshot.appendSections([0])
        snapshot.appendItems(models, toSection: 0)
        dataSource.apply(snapshot, animatingDifferences: true, completion: nil) // <--- crashing...
    


struct Contact: Hashable 
    var id: Int
    var firstName: String
    var lastName: String
    var dateOfBirth: String

嗯...应用程序崩溃并出现错误“无效参数不满足:快照。”几天前,我测试了另一个示例,它也在同一行(dataSource.申请)。我在网上找不到很多涉及NSTableViewDiffableDataSource 的例子。我发现的唯一例子是 this topic,它没有帮助。无论如何,我做错了什么?我的 Xcode 版本是 13.1。谢谢。

【问题讨论】:

【参考方案1】:

像这样创建一个快照,它应该可以工作:

guard let dataSource = self.dataSource else 
    return


var snapshot = NSDiffableDataSourceSnapshot<Int, Contact>()
snapshot.appendSections([0])
snapshot.appendItems(models, toSection: 0)
dataSource.apply(snapshot, animatingDifferences: false)

【讨论】:

是的,它有效。非常感谢。

以上是关于如何使用 NSTableViewDiffableDataSource 通过 NSTableView 加载数据的主要内容,如果未能解决你的问题,请参考以下文章

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?

如何使用laravel保存所有行数据每个行名或相等

如何使用 Math.Net 连接矩阵。如何使用 Math.Net 调用特定的行或列?

WSARecv 如何使用 lpOverlapped?如何手动发出事件信号?