TabViewでタブ移動をキャンセル

SwiftUIのTabViewでタブ移動をキャンセルするのは少し工夫が必要です。selectedTabを一旦戻す方法で実装します。

ポイント解説

なぜ selectedTab = oldValue を先に戻すのか

SwiftUIのTabViewはタブ選択を内部状態で管理するため、onChangeの中で単純にアラートを出すだけでは見た目上タブが移動してしまいます。そのため、アラートを出す前に即座に元のタブへ戻し、ユーザーが「はい」を選んだ場合のみ pendingTab に保存した移動先へ遷移させます。

フロー整理

.onChange()以外で何か方法はありますか?(タブが変わる処理をする前にこの確認を行いたい場合)

残念ながら、SwiftUIのTabViewには 「タブ変更を事前にインターセプトする」公式なAPIは存在しません。

現実的な代替手段をいくつか紹介します。

① タブアイテムをカスタムボタンで自作する

TabViewを使わず、タブバー自体を自前で実装する方法です。

タブ変更のに処理を挟めるので、今回の目的に最も素直に合います。ただしタブバーのデザインを自分で作る手間があります。

② @Bindable + カスタムBinding で selectedTab を監視

Bindingのsetをラップして変更を横取りする方法です。

onChangeより意図が明確ですが、macOSのTabViewでは動作が不安定なケースがあるため注意が必要です。

結論

方法事前インターセプト安定性手間
onChange で即戻す(現行)疑似的に可能
カスタムタブバー✅ 真の意味で可能
カスタムBindingほぼ可能

「タブが変わる前に確認したい」という目的であれば、カスタムタブバーが唯一の完全な解決策です。 現行の onChange 方式で実用上問題なければ、そのままが一番シンプルです。

コメント

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