SwiftUIのtoolbarは基本的に画面遷移すると消えるのですが、
NavigationLinkで遷移してもtoolbarのスペースが空白として残るケースに遭遇しました。
直接的な原因と解決法が分からなかった為、暫定的な解決方法を紹介します。
問題が起こりうるコード
解決方法の提示の為の構成の紹介であり該当コードで問題が起こりうるとは限りません。
※Itemについてはクラスや構造体を定義し、配列にして使っているという想定です
List{
ForEach(self.items){ item in
NavigationLink(item.name){
ItemView(item:item)
}
}
}
.toolbar{
ToolbarItem(placement: .bottomBar){
BottomBarView()
}
}
暫定的な解決法
画面遷移が起きた際に非表示にすることで対応します。
@SceneStorageを使用して画面の遷移状況を取得し、遷移前であるnilの場合のみtoolbarを表示します
@SceneStorage("SelectedItem") var selectedItem:String?
List{
ForEach(self.items){ item in
NavigationLink(
destination: ItemView(item:item),
tag: item:item.uuid?.uuidString ?? "NoUUID",
selection: self.$selectedItem){
Text(item.name)
}
}
}
.toolbar{
ToolbarItem(placement: .bottomBar){
if selectedItem == nil {
BottomBarView()
}
}
}
NavigationLinkをこの様に変更する事で、画面遷移状態がSceneStorageに保持されます。
今回は各ItemにUUIDを振って、その値の文字列を使用する様にしています。
これで遷移後は文字列が入っているのでBottomBarViewは表示されず、
遷移前のみnilが入っているのでBottomBarViewが表示されます。
toolbar Modifier自体にはそのままではifが使えないのでToolbarItemは残りますが、
中身のViewが無いと表示されなくなる為このままで構いません。
コメント