NavigationLinkは1度しか機能しません


75

ログインを使用してアプリケーションで作業していたところ、ログイン後にカテゴリがリストされています。また、各カテゴリの下には、いくつかの項目が横に並んでいます。ログイン後、メインページが表示され、すべてがリストに表示されます。アイテムをクリックすると詳細画面が表示されますが、戻ろうとするとクラッシュします。このフローを見つけました。`NavigationView`の `navigationBarItems`内に` NavigationLink`を配置した後、後方に移動するとSwiftUIアプリがクラッシュするのはなぜですか?しかし、私は私の問題を解決できませんでした。プロジェクトが複雑になったので、swiftuiでナビゲーションを練習したかっただけで、新しいプロジェクトを作成しました。ちなみに、最新のxcodeバージョン11.3をダウンロードしました。次のように簡単なコードを書きました。

NavigationView{
        NavigationLink(destination: Test()) {
            Text("Show Detail View")
        }
    .navigationBarTitle("title1")

また、Test()ビューは次のとおりです。

import SwiftUI

struct Test: View {
    var body: some View {
        Text("Hello, World!")
    }
}

struct Test_Previews: PreviewProvider {
    static var previews: some View {
        Test()
    }
}

ご覧のとおり、とても簡単です。私もインターネットで同様の例を試しましたが、想定したように機能しません。プロジェクトを実行するときに、ナビゲーションリンクをクリックすると、Test()ビューに移動します。次に、戻るボタンをクリックすると、メインページに移動します。しかし、ナビゲーションリンクを2回クリックしても何も起こりません。ナビゲーションリンクが機能するのは1回だけで、その後は何も起こりません。ナビゲートせず、エラーもスローしません。私はSwiftuiに慣れていないので、ナビゲーション以外はすべて素晴らしいです。インターネットで多くの例を試し、解決策を提案しましたが、問題を解決するものは何もないようです。


2
キャンバスとデバイスの両方で予想通りのXcode 11.2のバージョン(11B52)は、このコードは動作
АлександрГрабовский

3
Xcode 11.2 / iOS 13.2でコードスナップショットをテストしました-うまく機能します。Xcodeをダウングレードしてみてください。
アスペリ

1
Xcodeバージョン11.2.1(11B500)コードは必要に応じて機能します。
Nalov

2
私はそれが将来のアップデートを待つまま、アップルにレビューを送っ
АлександрГрабовский

1
バグレポートFB7518930
Pacu

回答:


56

[更新] 2020年2月12日-Xcode 11.4ベータ版でこの問題を確認したところ、この問題は解決されていることがわかりました。


Xcodeのシミュレーターでテストしていたときに、プロジェクトでも同じ問題が発生していました。しかし、実際のデバイス(iOS 13.3を搭載したiPhone X)でアプリを起動したところ、NavigationLinkまったく問題なく動作していました。したがって、実際にはXcodeのバグのように見えます。


10
まったく同じです。新しいアプリにSwiftuiを選択したことを後悔し始めています
theMouk

6
私は4時間費やしただけで非常に愚かでした...このようなものは生産準備ができていません...
セバスチャン

SwiftUIは基本的にバージョン1.0のままですが、製品リリースではv 1.0を使用する予定はありますか?あなたはそれが改善することを期待してそれから始めます。これが発生する前にリリースする必要がある場合、これは役に立ちません。
David Reich

@DavidReich SwiftUIがベータ版である場合、多くの問題があることを理解できました。生産準備の整ったツールでは、少なくとも機能することを期待する必要があります。昨年の最初のリリース以降、iOSとmacOSの「ポイントアップデート」がいくつかあったため、このような目立ったバグや「ジャンプリストのタイトルバグ」はずっと前に潰されているはずです。プロダクションアプリで使用しようとしましたが、適切な結果を得るためにUIKitに戻る必要がありました。
GJニルセン

3
[更新] 2020年2月12日-Xcode 11.4ベータ版でこの問題を確認したところ、この問題は解決されていることがわかりました。
Sagun Raj Lage

5

Simulator 11.4:この問題は修正されました

isActive2番目のビューでデフォルト値をリセットする必要があります。デバイスとエミュレーターで動作します。

struct NavigationViewDemo: View {
    @State var isActive = false

    var body: some View {
        NavigationView {
            VStack {
                Text("View1")
                NavigationLink(
                    destination: NavigationViewDemo_View2(isActive: $isActive),
                    isActive: $isActive,
                    label: { Button(action: { self.isActive = true }, label: { Text("click") }) })
            }
        }
    }
}

struct NavigationViewDemo_View2: View {
    @Binding var isActive: Bool

    var body: some View {
        Text("View2")
            .navigationBarItems(leading: Button(action: { self.isActive = false }, label: { Text("Back") }))
    }
}

NavigationLinkを複数回動作させると、シミュレータと物理デバイスの両方で問題が発生します。シミュレータでは何も修正されませんが、物理デバイスで機能するこれと同様の方法は、アクティブフラグをリセットするonDisappearをView2に設定することです。これは、Xcodeのバグに対しては少しクリーンな回避策です(View2が認識していない状態にバインドする必要がないため)。NavigationViewDemo_View2()。onDisappear(perform:{self.isActive = false})
SJoshi

@SJoshi取得しましたonDisappear が、後でisActivefalse が呼び出されるため、NavigationViewは正しく機能しません。NavigationViewがデバイスで正しく機能するため、これはエミュレーターの一時的なソリューションです。以前のバージョンのエミュレータではNavigationViewが機能しましたが、将来のエミュレータで修正されることを願っています。
ビクタークシュネロフ

奇妙なことに、このコードはシミュレータや物理デバイスでは機能しません-私が提案した解決策は、詳細ビューが閉じられたときにアクティブフラグをリセットし、物理デバイスが機能できるようにします。Xcode 13.4がこの問題を修正したということです
SJoshi

私はシミュレーター11.3.1でテストしましたが、それは魅力のように機能します。他の人も助けたと思います。
ビクタークシュネロフ

はい、私もそうです。複数のiPhoneを使用してテストしました。また、4つの物理デバイスでテストしました-運がありません。このバグは間違いなくとんでもないものです。その間、私はシミュレータに対してとんでもない回避策をとることになりました。
SJoshi


1

@АлександрГрабовскийはXcode 11.3のバグのように思われると言ったので、同じ問題が発生しています。ダウングレードするか、以下のようなカスタムの戻るボタンなどの回避策を使用する必要があります

struct ContentView: View {
    @State private var pushed: Bool = false

    var body: some View {

        NavigationView {
            VStack {
                Button("Show Detail View") {
                    self.pushed.toggle()
                }

                NavigationLink(destination: Test(pushed: $pushed), isActive: $pushed) { EmptyView() }
            }.navigationBarTitle("title1")
        }
    }
}
struct Test: View {
    @Binding var pushed: Bool
    var body: some View {
        Text("Hello, World!")
            .navigationBarBackButtonHidden(true)
            .navigationBarItems(leading: BackButton(label: "Back") {
                self.pushed = false
            })
    }
}
struct BackButton: View {
    let label: String
    let closure: () -> ()

    var body: some View {
        Button(action: { self.closure() }) {
            HStack {
                Image(systemName: "chevron.left")
                Text(label)
            }
        }
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.