アプリ作成は困難の連続です。またまた、はまりました。(はまる:解決方法が分からなく開発が停滞することです。)まる2日間、ネット上を解決策を探し続けました。いつもそうですが大変に苦しい時間です。
まず現象ですが、単純に言うと ColorPickerという色の選択画面で、色を選択して戻ったら、その後、画面の遷移を制御している変数(@Published定義済み)の値を変更して画面遷移をしようとしても、全く効かない(=画面遷移できない)という事象に遭遇しました。
そのColorPickerの画面は、画面階層でいうと、親⇢子⇢孫 の孫画面にあたりました。
親から子へ NavigationLinkを利用してジャンプし、子から孫へも同様にNavigationLinkを利用してジャンプしてきていました。
左画面が、上記説明で言う孫画面となります。
画面の一番下にアイコンを4つ程配置してあります。これをクリックすることで、違う画面に遷移させようと設計しました。具体的には、4つの親画面をさらに統括する画面(ContentView.swift)で、画面の遷移を制御する変数(@Published定義済み)の値1..4によりどの親画面を表示するかを決定するIF文があります。
ColorPicker画面で色を選択しなければ、アイコンクリックで、うまく画面遷移できていたのですが、色を選択した後では、まったく画面遷移できない状態に陥りました。
ネットを検索しているうちに、「NavigationLinkでジャンプした画面から2階層以上戻る場合」というような用語を見つけて、「あ、これって私だ。」と思い、その記事を読んでみると、何と NavigationLinkを使用する上位側の画面のモディファイアに、.isDetailLink(false) を書かないと、2階層戻れないと書いてある。えー、そんなことあるのー。で、試してみました。本当だ。これで戻れる。びっくり~仰天。
感謝していますサイト:SwiftUIで2つ以上前の画面へ戻る方法
のこの説明ソースと
と、この文字
に、深く感謝いたします。ありがとうごぎいました。
そして、もうひとつ、このサイトにも感謝いたします。
SwiftUIで初めの画面に遷移する(popToRootViewController)
上記サイトで、使用されていたソースを全文コピー掲載させていただきます。isDetailLink
がポイントでした。ありがとうごぎいました。
import SwiftUI
struct ContentView: View {
@State var isActive : Bool = false
var body: some View {
NavigationView {
NavigationLink(
destination: SecondView(rootIsActive: $isActive),
isActive: $isActive
) {
Text("Go SecondView")
}
.isDetailLink(false)
.navigationBarTitle("Root")
}
}
}
struct SecondView: View {
@Binding var rootIsActive : Bool
var body: some View {
NavigationLink(destination: ThirdView(shouldPopToRootView: self.$rootIsActive)) {
Text("Go ThirdView")
}
.isDetailLink(false)
.navigationBarTitle("SecondView")
}
}
struct ThirdView: View {
@Binding var shouldPopToRootView : Bool
var body: some View {
VStack {
Button (action: { shouldPopToRootView = false } ){
Text("Pop to RootView")
}
}.navigationBarTitle("ThirdView")
}
}
【Xcode】13.3
【Swift】5.6
【iOS Deployment Target】15.4
【macOS】macOS Monterey 12.3