NavigationLink Hanya Bekerja Sekali

75

Saya sedang mengerjakan aplikasi dengan login dan setelah login ada kategori yang terdaftar. Dan di bawah setiap kategori ada beberapa item yang terdaftar secara horizontal. Masalahnya adalah setelah login, halaman utama muncul dan semuanya terdaftar dengan baik. Ketika Anda mengklik pada suatu item ia pergi ke layar terperinci tetapi ketika Anda mencoba untuk kembali itu hanya crash. Saya menemukan aliran ini. Mengapa aplikasi SwiftUI saya mogok ketika menavigasi mundur setelah menempatkan `NavigasiLink` di dalam` navigationBarItems` dalam `NavigationView`? tetapi saya tidak bisa menyelesaikan masalah saya. Karena proyek saya menjadi rumit, saya hanya ingin berlatih navigasi di swiftui dan saya membuat proyek baru. Ngomong-ngomong, saya mengunduh xcode versi terbaru 11.3. Saya menulis kode sederhana sebagai berikut:

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

Dan tampilan Test () adalah sebagai berikut:

import SwiftUI

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

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

Seperti yang Anda lihat, ini sangat sederhana. Saya juga mencoba contoh serupa di internet tetapi tidak berfungsi sebagaimana mestinya. Ketika saya menjalankan proyek, saya mengklik tautan navigasi dan menavigasi ke tampilan Test (). Lalu saya klik tombol kembali dan itu menavigasi ke halaman utama. Namun, ketika saya mengklik tautan navigasi untuk kedua kalinya, tidak ada yang terjadi. Tautan navigasi hanya berfungsi sekali dan setelah itu tidak ada yang terjadi. Itu tidak menavigasi, itu tidak membuang kesalahan. Saya baru mengenal swiftui dan semuanya hebat kecuali navigasinya. Saya mencoba banyak contoh dan menyarankan solusi di internet, tetapi sepertinya tidak ada yang memperbaiki masalah saya.

C.Aglar
sumber
2
versi xCode 11.2 (11B52), kode ini berfungsi seperti yang diharapkan pada kanvas dan perangkat
Александр Грабовский
3
Diuji snapshot kode Anda dengan Xcode 11.2 / iOS 13.2 - berfungsi dengan baik. Coba turunkan Xcode.
Asperi
1
Xcode versi 11.2.1 (11B500) kode Anda berfungsi sebagaimana mestinya.
Nalov
2
Saya mengirim ulasan ke Apple, masih menunggu pembaruan di masa mendatang
Александр Грабовский
1
Mengirim laporan bug FB7518930
Pacu

Jawaban:

56

[UPDATE] 12 Februari 2020 - Saya memeriksa masalah ini dalam Xcode 11.4 beta dan menemukan bahwa masalah ini telah diselesaikan.


Saya mendapatkan masalah yang sama di proyek saya juga, ketika saya mengujinya di simulator Xcode. Namun, ketika saya meluncurkan aplikasi pada perangkat nyata (iPhone X dengan iOS 13.3), NavigationLinkberfungsi dengan sangat baik. Jadi, itu benar-benar tampak seperti bug Xcode.

Sagun Raj Lage
sumber
10
persis sama untuk saya. Saya mulai menyesal telah memilih Swiftui untuk aplikasi baru
theMouk
6
Saya hanya menghabiskan 4 jam merasa sangat bodoh ... Barang ini belum siap produksi ...
Sebastian
SwiftUI pada dasarnya masih versi 1.0 Apakah Anda pernah berencana menggunakan v 1.0 untuk rilis produksi? Anda mulai dengan itu dengan harapan akan membaik. Ini tidak membantu jika Anda perlu melepaskannya sebelum itu terjadi.
David Reich
@ David Reich jika SwiftUI dalam versi beta, saya bisa mengerti akan ada banyak masalah. Dalam peralatan siap produksi, yang paling tidak harus diharapkan adalah bahwa itu berfungsi. Ada beberapa "pembaruan poin" iOS dan macOS sejak rilis awal tahun lalu, jadi bug yang mencolok seperti ini atau "bug judul daftar lompatan" seharusnya sudah terjepit sejak lama. Saya mencoba menggunakannya untuk aplikasi produksi, tetapi harus kembali ke UIKit untuk mendapatkan hasil yang layak.
GJ Nilsen
3
[UPDATE] 12 Februari 2020 - Saya memeriksa masalah ini dalam Xcode 11.4 beta dan menemukan bahwa masalah ini telah diselesaikan.
Sagun Raj Lage
5

Simulator 11.4: Masalah ini telah diperbaiki

Anda harus mengatur ulang nilai default isActivedi tampilan kedua. Ini bekerja pada perangkat dan emulator.

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") }))
    }
}
Victor Kushnerov
sumber
Saya mengalami masalah dengan simulator dan perangkat fisik saya agar NavigLink berfungsi lebih dari satu kali. Tidak ada yang memperbaikinya di simulator, tetapi metode yang mirip dengan ini yang berfungsi untuk perangkat fisik saya adalah pengaturan onDisappear pada View2 yang mengatur ulang flag yang aktif. Ini solusi yang sedikit lebih bersih untuk bug Xcode (karena Anda tidak harus mengikat ke kondisi yang seharusnya tidak diketahui oleh View2). NavigationViewDemo_View2 (). OnDisappear (perform: {self.isActive = false})
SJoshi
@ Soshi Saya mendapatkannya tetapi onDisappear akan dipanggil setelah isActiveitu salah sehingga NavigationView tidak akan berfungsi dengan baik. Ini solusi sementara untuk emulator hanya karena NavigationView berfungsi dengan benar di perangkat. Pada emulator versi sebelumnya, NavigationView berfungsi, saya harap ini akan diperbaiki di emulator masa depan.
Victor Kushnerov
Anehnya, kode ini tidak berfungsi pada simulator ATAU perangkat fisik saya - solusi yang saya usulkan mengatur ulang bendera aktif ketika tampilan detail dibubarkan, dan memungkinkan perangkat fisik berfungsi. Kata di jalan adalah bahwa Xcode 13.4 memperbaiki masalah ini
SJoshi
Saya menguji pada simulator 11.3.1 itu bekerja seperti pesona. Anda lihat 3 dimulai saya kira orang lain juga membantu.
Victor Kushnerov
Yap, saya juga mengujinya - menggunakan beberapa iPhone. Juga, diuji pada 4 perangkat fisik - tidak berhasil. Bug ini jelas merupakan hal yang konyol. Saya akhirnya melakukan beberapa solusi konyol sementara itu untuk simulator.
SJoshi
1

Sebagaimana @ Александр Грабовский mengatakan sepertinya bug Xcode 11.3, saya menghadapi masalah yang sama, Anda harus menurunkan versi atau menggunakan solusi seperti tombol kembali kustom seperti di bawah ini

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)
            }
        }
    }
}
ozmpai
sumber