【问题标题】:What is the right syntax for tableView functions in Swift 3? xCode 8 issuesSwift 3 中 tableView 函数的正确语法是什么? xCode 8 问题
【发布时间】: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


【解决方案1】:

重新启动我的计算机消除了非法 NSTableView 数据源。我猜 xCode 8 自己进入了一个无法释放错误的状态。

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

【讨论】:

  • 我讨厌这些随机问题,唯一的办法就是重启你的 Mac :-D
【解决方案2】:

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

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
    }
}

【讨论】:

    【解决方案3】:

    Swift 3 更新

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

    func numberOfRows(in tableView: NSTableView) -> Int
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多