SwiftUI/NavigationLink/.isDetailLink(false) が必要だったんですね。全く知らなかったです。感謝しかありません。

SwiftUI

アプリ作成は困難の連続です。またまた、はまりました。(はまる:解決方法が分からなく開発が停滞することです。)まる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 

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