swift - 使用默认方法扩展 NSTableViewDataSource 协议(protocol)

标签 swift nstableview

我想在 NSTableViewDataSource 协议(protocol)中添加一个默认方法。但是当我这样做时,默认值总是被调用,即使该方法是在实际数据源中定义的。具体来说:

我有一个单列的 NSTableView,它可以在不同的时间采用多个不同的数据源。在一种情况下,我希望数据源不仅能够提供显示的值,还能提供表中各行的背景颜色。在其他情况下,表格可以是单一颜色。我的想法是首先扩展 NSTableViewDataSource 协议(protocol):

extension NSTableViewDataSource
  { 
    func tableView (tableView: NSTableView, colorIndexForRow row: Int) -> Int
      { 
        return 0 
      }
  }

然后在表委托(delegate)中我放了这个:

public func tableView (tableView: NSTableView, didAddRowView rowView: NSTableRowView, forRow row: Int)
  { 
    let colorIndex = tableView.dataSource()!.tableView(tableView, colorIndexForRow: row)
    rowView.backgroundColor = rowColors[colorIndex]
  }

(rowColors 只是一个 NSColor 对象数组,六个用于实验目的。)

最后,我的实验数据源是这样的:

public func numberOfRowsInTableView (tableView: NSTableView)  -> Int
  { 
    return 100
  }

public func tableView (tableView: NSTableView, objectValueForTableColumn column: NSTableColumn?, row: Int) -> AnyObject?
  { 
    return String(format: "This is row %3i", row)   
  }

public func tableView (tableView:  NSTableView, colorIndexForRow row: Int) -> Int
  { 
    return row % 6    
  }

我希望这会生成一个表格,其中的行以六种颜色循环排列。我实际得到的是一张全部采用 rowColors[0] 颜色的表格。始终调用我的 colorIndexForRow 方法的默认值,即使我在数据源中提供了该方法。我对 Swift 文档的阅读是,协议(protocol)扩展中的默认值应该仅在实际方法不存在时才被调用。谁能告诉我我做错了什么?

最佳答案

原因是因为协议(protocol)扩展doesn't support class polymorphism .

您可以将函数重写为:

public func tableView (tableView: NSTableView, didAddRowView rowView: NSTableRowView, forRow row: Int)
{ 
    let colorIndex = self.tableView(tableView, colorIndexForRow: row)
    rowView.backgroundColor = rowColors[colorIndex]
}

关于swift - 使用默认方法扩展 NSTableViewDataSource 协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38645649/

相关文章:

objective-c - 如何知道当前 UITableView 单元格相对于 swift 3.0 中的 UIViewController 的位置?

ios - UIWebView 委托(delegate)不更改其他 View

swift - 我应该如何保存xml子元素值? [ swift ]

swift - Realm + NSTableView + NSArrayController

ios - NSCoding 意外发现 nil

swift - 将一些文本垂直居中放置在 NSTableView 的行中的正确方法是什么?

objective-c - 如何使用 Binding 创建带有自定义单元格的 NSTableview

swift - controlTextDidEndEditing 在 NSTableView 加载时被调用

swift - 如何在 NSTableView 中实现复制(发送者 : AnyObject? )?

swift - Perfect-Swift如何读写图片到web根目录?