【发布时间】:2016-09-12 16:07:27
【问题描述】:
我刚刚升级到 xCode 版本 8.0 (8A218a)。我一直在尝试将一些旧代码转换为 Swift 3.0,我正在努力理解如何解决 tableView 的一些问题,我对文档和我遇到的一些错误感到困惑。
我收到了这个错误
*** 非法的 NSTableView 数据源()。必须实现 numberOfRowsInTableView: 和 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 函数的警告:
实例方法'tableView(tableView:objectValueForRow:row:)' 差不多 匹配可选要求 'tableView(:setObjectValue:for:row:) 的 协议'NSTableViewDataSource'
我查看了委托文档,他们说 setObjectValue 不应该用于基于视图的 tableView,这就是我所拥有的(我认为)。
我最初用于表格列的代码是:
tableView(tableView: NSTableView, objectValueForTableColumn tableColumn: NSTableColumn?, row: Int) -> AnyObject? { . . .
在将项目引入 xCode 8 之前,这条线运行良好
有人可以解释一下基于视图的 tableViews 应该如何与 Swift 3 一起工作以及我哪里出错了吗?非常感谢任何帮助。
【问题讨论】:
-
让 Xcode 自动为你完成它。尝试 Any 而不是 AnyObject
-
我已经厌倦了让自动完成工作。我可以摆脱 xCode 喜欢的版本的警告:
tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any?但我仍然收到非法数据源错误。我已经仔细检查了 Connections 检查器,清理了项目等。 -
我在一个真实的项目上检查过dropbox.com/s/88zszm4byjqvzld/…所以你可以看到没有错误。
标签: macos nstableview swift3 xcode8