Swift 3 中 tableView 函数的正确语法是什么? xCode 8 期

What is the right syntax for tableView functions in Swift 3? xCode 8 issues

我刚刚升级到 xCode 版本 8.0 (8A218a)。我一直在尝试将一些旧代码转换为 Swift 3.0,我正在努力了解如何解决 tableView 的一些问题,我对文档和我遇到的一些错误感到困惑。

我遇到这个错误

*** Illegal NSTableView data source (). Must implement numberOfRowsInTableView: and tableView:objectValueForTableColumn:row:

当运行这段代码时:

class listMusicEvents: ViewController, performanceDataModelDelegate, NSTableViewDelegate, NSTableViewDataSource {

let eventModel = performanceDataModel.sharedInstance
var musicEvents:[performanceEvent] = []


@IBOutlet var tableView: NSTableView!


override func viewDidLoad() {
    super.viewDidLoad()
    eventModel.delegate = self
    tableView.delegate = self
    eventModel.getPerformanceEvents()
}

func performanceEventsLoaded() {

    musicEvents = eventModel.eventList
    print(musicEvents[0].eventTitle)
}

func performanceSaveError(headline: String, message: String, error: NSError) {
    print(error)
}

func numberOfRowsInTableView( in tableView: NSTableView) -> Int {
    return musicEvents.count
}

func tableView(_tableView:NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> AnyObject{

    if tableColumn?.title == "Date" {
        let date = musicEvents[row].eventDate
        return date as AnyObject

    } else {

        let title = musicEvents[row].eventTitle
        return title as AnyObject
    }

}

}

我以为我已经实现了新方法,但看起来我不了解一些基本的东西。

我收到有关 objectValueFor 函数的警告:

Instance method 'tableView(tableView:objectValueForRow:row:)' nearly matches optional requirement 'tableView(:setObjectValue:for:row:) of protocol 'NSTableViewDataSource'

我查看了委托文档,他们说 setObjectValue 不应该用于基于视图的 tableView,这正是我所拥有的(我认为)。

我最初用于 table 列的代码是:

tableView(tableView: NSTableView, objectValueForTableColumn tableColumn: NSTableColumn?, row: Int) -> AnyObject? { . . .

这条线在将项目引入 xCode 8

之前运行良好

谁能解释一下基于视图的 table 视图应该如何与 Swift 3 一起工作以及我错了什么?非常感谢任何帮助。

重新启动我的计算机消除了非法 NSTableView 数据源。我猜想xCode 8自己工作到不能放过错误的状态。

自动完成提供的 objectValueFor 函数是正确的。

我解决了这个问题如下。 添加 NSTableViewDataSource 协议到 ViewController class.

class ViewController: NSViewController,NSTableViewDataSource{

    // snip //

    func numberOfRows(in tableView: NSTableView) -> Int {        

      // snip //

      return count
    }

    func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any?{

      // snip //

      return element
    }
}

更新 Swift 3

我不得不使用以下原型...自动完成是你的朋友:

func numberOfRows(in tableView: NSTableView) -> Int

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