TSVTableViewの概念的な仕組み
このTSVTableViewというのはどういった感じでテーブルが作成されますか?
列を作成するとその分のテーブルの列数が作成されてそこにセルを作成して文字列を表示させる。といった感じなのでしょうか?
はい、ほぼその理解で合っています!もう少し詳しく説明します。
全体の構造
TSVTableView (NSViewRepresentable)
│
├── NSScrollView ← スクロール対応のコンテナ
│ └── NSTableView ← テーブル本体
│ ├── NSTableColumn × N本 ← 「列の定義」だけ(データは持たない)
│ └── セルを必要な分だけ生成・再利用
│
└── Coordinator ← DataSource / Delegate の橋渡し役
描画の流れ
① rebuildColumns() で列を定義
NSTableColumn を maxColumnCount 本追加
※ここで決まるのは「列の幅・タイトル」だけ
col_0 col_1 col_2
┌──────┬──────┬──────┐
│ │ │ │ ← まだ空
└──────┴──────┴──────┘
② NSTableView が描画時に Coordinator へ問い合わせ
┌─────────────────────────────────────┐
│ numberOfRows → store.rows.count を返す │
│ viewFor row:col: → EditableCell を返す │
└─────────────────────────────────────┘
③ 画面に見えている分だけセルを生成(仮想化)
col_0 col_1 col_2
┌──────┬──────┬──────┐
row0 │ aaa │ bbb │ ccc │
row1 │ ddd │ eee │ fff │
row2 │ ggg │ hhh │ iii │
└──────┴──────┴──────┘
重要なポイント:セルの「再利用」
NSTableView は 画面外に出たセルを捨てずに再利用します。
コード上では makeView(withIdentifier:) がこの再利用を担っています。
|
1 2 3 4 5 6 7 8 |
// 再利用できるセルがあればそれを使い、なければ新規作成 if let reused = tableView.makeView(withIdentifier: Self.cellID, owner: self) as? EditableCell { cell = reused // 使い回す } else { cell = EditableCell() // なければ新規 } // どちらにせよ必ず configure() で正しいデータを上書き cell.configure(value: ..., row: row, col: colIdx, store: store) |
データの流れまとめ
TSVファイル
↓ loadTSV()
TableStore.rows[行][列] ← データの唯一の源泉
↓ Coordinatorが問い合わせ
NSTableView が描画
↓ ユーザーが編集
EditableCell → updateCell() → store.rows を更新
func tableView() が呼ばれるタイミング
func updateNSView()
内にある
tableView.reloadData()
が呼んでいる
コメント