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?
我刚刚升级到 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?