4

ビューベースNSTableViewで、特定の行の外観をカスタマイズしようとしています。

タイトルに記載されているデリゲート メソッドを実装する必要があることは理解しています。しかし、私はそれを行う方法がわかりません。

ドキュメントには次のように記載されています。

デリゲート メソッド tableView:rowViewForRow: を使用して、行ビューをカスタマイズできます。通常、Interface Builder を使用して、テーブル内の NSTableRowView プロトタイプ行を設計およびレイアウトします。プロトタイプ セルと同様に、プロトタイプ行は実行時にプログラムによって取得されます。NSTableRowView サブクラスの実装は完全にオプションです。

ただし、セルとは異なりNSTableRowView、インターフェイス ビルダーにはクラスがなく、「プロトタイプ」行ビューをセットアップする方法も明確ではありません。

私はこのようなことを試みています(Swift 3):

func tableView(_ tableView: NSTableView, rowViewForRow row: Int) -> NSTableRowView?
{
    if (row % 4) == 0 {
        // .................................................. 
        // [ A ] SPECIAL ROW:

        if let rowView = tableView.make(withIdentifier: "SpecialRow", owner: self) as? NSTableRowView {

            rowView.backgroundColor = NSColor.gray()
            return rowView
        }
        else {
            return nil
        }

        // ^ Always returns nil (Because I don't know how
        // to setup the prototype in Interface Builder)
    }
    else{
        // ..................................................
        // [ B ] NORMAL ROW (No customization needed)

        return nil
    } 
}

セルに対して同様のコードが機能しています-つまり、-tableView:viewForTableColumn:row:.

4

1 に答える 1

4

わかりましたので、明らかな (?) 解決策が機能しました。

  1. Interface Builder で、プレーン バニラをテーブルにドラッグ アンド ドロップします (テーブル ビューの直接の子としてではなくNSView、特定の列でのドロップのみを受け入れます)。

  2. ドロップしたばかりのビューの Identity Inspector に移動し、そのクラスを「NSTableRowView」に変更します。

  3. 私のコードのように .backgroundColor プロパティを設定するだけでは機能しないため、代わりにこのソリューションを使用し、ボックス ビューを子として追加し、Interface Builder で構成しました。実行時に行ビューの実際のサイズに拡張されるように、ボックスと行ビューの間に自動レイアウトの制約を設定する必要がありました。

wantsLayer(または、行ビューのプロパティで遊ぶこともできました...)


更新:backgroundColorコードで使用していたプロパティがで定義されていることがわかりましたNSTableRowView(NSViewとは異なり、そのようなプロパティはありませんUIView)。

ただし、テーブル ビューの設定 (行を交互にするかどうか) によってもオーバーライドされるため、代わりに次の方法でカスタマイズする必要があります。

func tableView(_ tableView: NSTableView, didAdd rowView: NSTableRowView, forRow row: Int)
{
    if (row % 4) == 0 {
        rowView.backgroundColor = NSColor.controlAlternatingRowBackgroundColors()[1]
    }
    else{
        rowView.backgroundColor = NSColor.clear()
    }    
}

...追加された後(およびテーブルビューによって構成された背景色)。

(ちなみに、結局、カスタム行ビューは必要ないことがわかりました。少なくとも背景色をカスタマイズする必要はありません)

于 2016-08-15T09:36:49.497 に答える