我刚刚升级到 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'
我查看了委托(delegate)文档,他们说 setObjectValue 不应该用于基于 View 的 tableView,这就是我所拥有的(我认为)。
我最初用于表列的代码是:
tableView(tableView: NSTableView, objectValueForTableColumn tableColumn: NSTableColumn?, row: Int) -> AnyObject? { . . .
在将项目引入 xCode 8 之前,这条线运行良好
有人可以解释一下基于 View 的 tableViews 应该如何与 Swift 3 一起使用以及我犯了什么错误吗?非常感谢任何帮助。
最佳答案
重新启动计算机消除了非法的 NSTableView 数据源。我猜 xCode 8 已经进入了无法摆脱错误的状态。
自动完成提供的 objectValueFor 函数是正确的。
关于macos - Swift 3 中 tableView 函数的正确语法是什么? xCode 8 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39454522/