NSTableView CellBasedを試してみる(macos)

Xamarin.Mac + storyboardで、XCode(Interface Builder)でUI作って、ロジックは手慣れたC#でとか思っているのだが、NSApplication.ModalResponse.OK が、C#側で見つからなくて少し萎えたのと、そもそもstoryboardの使い方がよくわからないので、NSTableViewのCellBased(あと、ViewBasedがあるみたい)を実装しながら、少し慣れる。

Working with NSCell-Based Table Views (apple.com)

1.Table ViewをViewControllerに追加

+ボタンを押すとコマンドパレット的なものが開く(XCodeこのあたりの名前がよくわからないので辛い、、、バージョン上がってアイコン変わってたり)ので、Table View を検索し、ドロップする。

Tool lib

Nstableview celbased00001

Table Viewを選択し、Attributes Inspector のアイコンを選択し、Content Mode を Cell Basedに

Nstableview celbased00002

カラムがデフォルトで、2列作られるので、それぞれに、Identity Inspector アイコンを選択し、IDを設定する。

カラム数を変えるときには、Attributes Inspector の Columns の数値を変える。

Nstableview celbased00003

同様に2列目のIDも設定

Nstableview celbased00004

2.DataSourceとDelegateのバインド

Table Viewをcontrolボタンを押しながら、View Controller へドラッグ&ドロップ

Nstableview celbased00006

Outletsで、dataSourceおよびdelegateを選択する。

Nstableview celbased00007

ViewControllerと連携された。

Nstableview celbased00008

コードから利用できるように、オブジェクトをViewController.swiftにドラッグ&ドロップして、Outletを作成。

Nstableview celbased00009

Nstableview celbased00010

3.ソース

上図で、ドラッグ&ドロップでコード生成したりしているのだけれど、プロトコルの宣言は自動でされないのかしら?

手動でNSTableViewDelegate, NSTableViewDataSourceを実装、

  • rows :ダミーデータ
  • viewDidLoad:ダミーデータを詰める
  • numberOfRows:ダミーデータ件数
  • tableView:ダミーデータのセル値を返す
import Cocoa

class ViewController: NSViewController, NSTableViewDelegate, NSTableViewDataSource  {

    @IBOutlet weak var tblView: NSTableView!
    @IBOutlet weak var tblCol1: NSTableColumn!
    @IBOutlet weak var tblCol2: NSTableColumn!
    
    var rows : [NSDictionary] = []
    
    func numberOfRows(in tableView: NSTableView) -> Int {
        return self.rows.count;
    }

    func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any? {
        return rows[row][(tableColumn?.identifier)!]
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        for i in 0 ..< 10 {
            rows.append(NSDictionary(dictionary: ["tblCol1": "Col1-\(i)", "tblCol2": "Col2-\(i)"]))
        }
        self.tblView.reloadData();
    }

    override var representedObject: Any? {
        didSet {
        // Update the view, if already loaded.
        }
    }
}

4.実行

とりあえず表示できた。

Nstableview celbased00011

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です