TSVTableView

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:) がこの再利用を担っています。

データの流れまとめ

TSVファイル
↓ loadTSV()
TableStore.rows[行][列] ← データの唯一の源泉
↓ Coordinatorが問い合わせ
NSTableView が描画
↓ ユーザーが編集
EditableCell → updateCell() → store.rows を更新

func tableView() が呼ばれるタイミング

func updateNSView()
内にある
tableView.reloadData()
が呼んでいる

コメント

タイトルとURLをコピーしました