2016-07-28 14 views
0

NSTableViewDataSourceプロトコルにデフォルトのメソッドを追加したいと思います。しかし、これを行うと、メソッドが実際のデータソースで定義されていても、デフォルトが常に呼び出されます。具体的には:デフォルトのメソッドでNSTableViewDataSourceプロトコルを拡張する

私は、異なる時刻にいくつかの異なるデータソースを採用することができる単一列のNSTableViewを持っています。 1つのケースでは、データソースは、表示される値だけでなく、表の行の背景色も提供できるようにしたいと考えています。それ以外の場合、表は単一の色にすることができます。

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

を、私はこれを入れて、テーブルのデリゲートに:私の考えは、最初NSTableViewDataSourceプロトコルを拡張した

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オブジェクトの配列だけ、実験目的のために6である。)

最後に、私の実験データソースは次のようになります。

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  
    } 

私はこれが列が6色の回転周期にあるテーブルを作ることを期待しました。私が実際に得ているのは、rowColors [0]の色のテーブルです。 my colorIndexForRowメソッドのデフォルトは、データソースにメソッドを提供しても、常に呼び出されます。私がSwiftのドキュメントを読んだのは、プロトコルエクステンションのデフォルトは、実際のメソッドが存在しない場合にのみ呼び出されるはずだということです。誰かが私が間違っていることを教えてもらえますか?

答えて

1

プロトコル拡張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] 
} 
+0

うーん...うわー?私はあなたが私の質問に答えたと思うが、あなたが与えた参照を吸収するために私に1日か2日を与える。その間、テーブルのデリゲートを可能な限りデータソースとは別にしておきたいと強調していないため、おそらくあなたの提案した関数を動作させることができませんでした。この関数はデリゲートにあり、self.tableViewはそこでは使用できません。私は物事を並べ替えることを考えますが、今はプロトコルの拡張が最善の方法であるかどうかはわかりません。 –

+0

非多型は、関数を定義するときに、この元の定義に固執する必要があることを意味します。 'tableView(、colorForRowIndex:)'の新しい実装を提供するクラスはそれを置き換えることはできません。だからこそ、常に0を返すのです。それが元々定義された方法です。 –

+0

助けてくれてありがとう。私は私のために働くように思われる最終的な答えを掲示したが、私はあなたに緑の旗を与え、私を軌道に乗せるための投票を行った。私はそれがすべてStackOverflowプロトコルに準拠していることを願っています。 –

0

:として

あなたは、あなたの関数を書き換えることができ、私の単純な一機能要件は、動的ディスパッチの問題対静的に対処正当化しません。

public protocol  ColorTableViewDataSource: NSTableViewDataSource 
    { 
    func tableView (tableView: NSTableView, colorIndexForRow row: Int) -> Int 
    } 

との適合性のために、その後の私のデリゲート機能検査:

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

マイデータソース機能が全く変わらない代わりにNSTableViewDataSourceを拡張するのは、私は継承されたプロトコルを定義しました。私は色のついた行が必要なときに、新しいプロトコルに合わせてデータソースオブジェクトを宣言します。それは私が欲しいものを正確にするようです。

関連する問題