Tableの更新とライフタイム
変更をModelへ通知する
元データを変更しても、Tableは自動では再読込しません。操作後にModelへ該当する通知を送ります。
# 追加後。new_indexは追加した行番号です。
rows << "New item"
model.row_inserted(rows.size - 1)
# 既存行の変更後。
rows[row] = "Renamed"
model.row_changed(row)
# 削除前の行番号を使い、元データを削除してから通知します。
rows.delete_at(row)
model.row_deleted(row)
複数行の変更では、元データと通知の順序を常に一致させます。ソートは全行の対応関係を変えるため、各行をrow_changedで通知するか、用途に応じてModelを作り直す設計を選びます。
安全な破棄順
Modelを利用しているTableが残ったままmodel.freeを呼んではいけません。親コンテナからTableを外し、Tableを破棄してからModelを解放します。
window.on_closing do
window.delete(table) # Tableをウィンドウから外す
table.destroy # Modelより先にTableを破棄する
model.free
UIng.quit
true
end
同じModelを複数のTableで使う場合は、すべてのTableを先に破棄します。破棄後にModelへ行通知を送らず、Table::ValueやSelectionをコールバック外へ保持しないでください。
この順序を守ると、画面を閉じる処理とデータ更新処理をそれぞれ小さく保てます。