【问题标题】:Illegal NSTableView data source in swift 4swift 4中非法的NSTableView数据源
【发布时间】:2019-04-10 01:51:25
【问题描述】:

对于 swift 4 这样的问题,我找不到任何答案或解决方案。我正在为 OSX 写作,当我用 tableView.reloadData() 重新加载我的 tableView 中的数据时,终端返回错误 -

非法的NSTableView数据源()。必须实现 numberOfRowsInTableView: 和 tableView:objectValueForTableColumn:row:

据我所知,我已经在扩展中实现了 numberOfRowsInTableViewtableView

有人能指出正确的方向吗?

    import Cocoa

    class ViewController2: NSViewController {


    var data: [[String: String]]?

    @IBOutlet weak var tableView: NSTableView!
    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        data = [
                [
                    "type" : "type1",
                    "details"  : "etc",
                    "cost" : "22"
                ],
                [
                    "type" : "type2",
                    "details"  : "etc",
                    "cost" : "33"
                ],
                [
                    "type" : "type3",
                    "details"  : "etc",
                    "cost" : "44"
            ]
        ]

        self.tableView.reloadData()
    }


    override var representedObject: Any? {
        didSet {
        // Update the view, if already loaded.
        }
    }


}

extension ViewController2: NSTableViewDataSource, NSTableViewDelegate{

    func numberOfRowsInTableView(tableView: NSTableView) -> Int {
        return (data?.count)!
    }

    func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
        let item = (data!)[row]
        let cell = tableView.makeView(withIdentifier: (tableColumn!.identifier), owner: self) as? NSTableCellView
        cell?.textField?.stringValue = item[(tableColumn?.identifier.rawValue)!]!
        return cell
    }
}

【问题讨论】:

  • 您是否尝试过重新组织您的代码,以便您的 tableview 方法在您的类中而不是扩展中?
  • 你必须实现这个方法 "tableView:objectValueForTableColumn:row:"

标签: swift macos swift4 nstableview


【解决方案1】:

您没有将 Swift 4 API 用于 NSTableViewDataSource 方法。而不是

func numberOfRowsInTableView(tableView: NSTableView) -> Int {}

使用这些正确的 API:

func numberOfRows(in tableView: NSTableView) -> Int

数据源API见官方文档:https://developer.apple.com/documentation/appkit/nstableviewdatasource

【讨论】:

  • NSTableViewDataSourcetableView(_:objectValueFor:row:) 不是NSTableViewDelegatetableView(_:viewFor:row:) 的Swift 4 版本。
  • 是的,确实我读得太快了,只有numberOfRowsInTableView这个方法不正确。
【解决方案2】:

我唯一的解决方案是重新启动 Xcode 和 Mac。代码没有任何问题。可能有人和我有同样的问题。

【讨论】:

    猜你喜欢
    • 2017-05-29
    • 1970-01-01
    • 2012-07-30
    • 2020-03-30
    • 1970-01-01
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多