2015-11-30 7 views
12

私は正常にセルベースのNSTableViewをコードで作成しました。セルをもう少し面白くしたいと思います。ビューベースのNSTableViewを作成する必要があることを読んでいます。純粋にコードでビューベースのNSTableViewを作成することはできますか?

私はthisのようなチュートリアルをしています。

私の残りのUIは完全にコードです。私は多くの運が無ければこのテーブルビューで同じことをしようとしています。ここで

 let nib = NSNib(nibNamed: "TransactionCellView", bundle: NSBundle.mainBundle()) 
     tableOfTransactions.registerNib(nib!, forIdentifier: "TransactionCellView") 

     tableOfTransactions.headerView = nil 

     tableOfTransactions.setDelegate(self) 
     tableOfTransactions.setDataSource(self) 
     tableOfTransactions.reloadData() 

は、各セルのための私のスタブコードです:

func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView?{ 
     var testCell = NSView() 
     testCell.frame = NSRect(x: 0, y: 0, width: 300, height: 200) 
     return testCell 
} 
私はペン先の登録を停止する必要があると私はどのように確認していない - ここ

は、私はテーブルビューを定義しています方法です

どのようにこれを達成するための指針や提案をいただければ幸いです!

+0

registerNibを実行しないとどうなりますか? – Willeke

答えて

5
次のようなものになるはずです -tableView(_:viewForTableColumn:row:)の実装

:あなたのテーブルに行数百人が含まれている場合は

func tableView(tableView: NSTableView, 
    viewForTableColumn 
    tableColumn: NSTableColumn?, 
    row: Int) -> NSView? { 

     var retval: NSView? 
     if let spareView = tableView.makeViewWithIdentifier("CodeCreatedTableCellView", 
      owner: self) as? NSTableCellView { 

      // We can use an old cell - no need to do anything. 
      retval = spareView 

     } else { 

      // Create a text field for the cell 
      let textField = NSTextField() 
      textField.backgroundColor = NSColor.clearColor() 
      textField.translatesAutoresizingMaskIntoConstraints = false 
      textField.bordered = false 
      textField.controlSize = NSControlSize.SmallControlSize 

      // Create a cell 
      let newCell = NSTableCellView() 
      newCell.identifier = "CodeCreatedTableCellView" 
      newCell.addSubview(textField) 
      newCell.textField = textField 

      // Constrain the text field within the cell 
      newCell.addConstraints(
       NSLayoutConstraint.constraintsWithVisualFormat("H:|[textField]|", 
        options: [], 
        metrics: nil, 
        views: ["textField" : textField])) 

      newCell.addConstraints(
       NSLayoutConstraint.constraintsWithVisualFormat("V:|[textField]|", 
        options: [], 
        metrics: nil, 
        views: ["textField" : textField])) 

      textField.bind(NSValueBinding, 
       toObject: newCell, 
       withKeyPath: "objectValue", 
       options: nil) 

      retval = newCell 
     } 

     return retval 
} 

は、ココアが既に作成されているビューを再利用しようとしませんが、画面上ではもはやあります。このスニペットの最初の部分は、NSTableViewメソッドを使用してそのようなビューを検索します。見つからない場合は、最初から作成する必要があります。

あなたがしなければならない理由がない場合は、NSTableCellViewのインスタンス(またはサブクラス)をビューとして使用する必要があります。 NSViewに多くは追加されませんが、主な機能の1つは、ビューが表すモデルへの参照を保持することです(-tableView(_:objectValueForTableColumnRow:row:)で設定)。この例では、この機能を使用して、バインディングを使用してテキストフィールドの文字列値を設定しています。

もう1つ注目すべき点は、ビューが表示されるNSTableColumnに与えた識別子に一致する識別子をビューに渡す必要があることです。そうすることで、テーブルビューで上記の再利用可能なビュー機能を利用することができます。

+0

これは実際にビジュアルデバッガに細胞を表示させるのに役立っています。完全な実装を示すためのおもちゃプロジェクトを作成する可能性はありますか? –

+0

これは、NIBを使用していないスタブプロジェクトでの試みです。 http://jmp.sh/6DdBVdP セルビューのコードでは動作しますが、テーブルビューのコードでは動作しません。 –

+1

デモへのリンク:http://jmp.sh/ZY9YAWo –

関連する問題