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.実行
とりあえず表示できた。












