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 を検索し、ドロップする。
Table Viewを選択し、Attributes Inspector のアイコンを選択し、Content Mode を Cell Basedに
カラムがデフォルトで、2列作られるので、それぞれに、Identity Inspector アイコンを選択し、IDを設定する。
カラム数を変えるときには、Attributes Inspector の Columns の数値を変える。
同様に2列目のIDも設定
2.DataSourceとDelegateのバインド
Table Viewをcontrolボタンを押しながら、View Controller へドラッグ&ドロップ
Outletsで、dataSourceおよびdelegateを選択する。
ViewControllerと連携された。
コードから利用できるように、オブジェクトをViewController.swiftにドラッグ&ドロップして、Outletを作成。
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.実行
とりあえず表示できた。