NavigationLink membeku ketika mencoba mengunjungi kembali NavigationLink yang sebelumnya diklik di SwiftUI

10

Saya merancang aplikasi yang mencakup fungsi mengambil data JSON dan menampilkan daftar item yang diambil dalam tampilan jenis FileBrowser. Dalam tampilan ini, pengguna harus dapat mengklik folder untuk menyelam lebih dalam ke pohon file atau klik pada file untuk melihat beberapa metadata tentang file tersebut.

Saya telah mengamati bahwa sementara ini berfungsi, ketika saya mengklik file atau folder kemudian kembali dan mengkliknya lagi, NavigationLink tidak terpicu dan saya terjebak pada tampilan sampai saya mengklik pada NavigationLink yang berbeda.

Berikut adalah gif yang menunjukkan masalah ini.

Bug Ketuk Ganda

Seperti yang terlihat di sini, ketika saya mengklik BlahBlah saya mengaktifkan NavigationLink dan dibawa ke BlahBlah, kemudian ketika saya menavigasi kembali dan mencoba untuk renavigate ke BlahBlah, itu menjadi abu-abu, mendaftar bahwa saya mengkliknya ... tetapi kemudian tidak pernah membawa saya ke sana . Mengklik TestFile memperbaiki ini dan memungkinkan saya untuk menavigasi kembali ke BlahBlah.

Daftar item dibuat dengan struct berikut

private struct FileCell{
    var FileName: String
    var FileType: String
    var FileID: String = ""
    var isContainer: Bool
}

private struct constructedCell: View{

    var FileType: String
    var FileName: String
    var FileID: String

    var body: some View {
        return
            HStack{
                VStack(alignment: .center){
                    Image(systemName: getImage(FileType: FileType)).font(.title).frame(width: 50)
                }
                Divider()
                VStack(alignment: .leading){
                    Text(FileName).font(.headline)
                        .multilineTextAlignment(.leading)
                    Text(FileID)
                        .font(.caption)
                        .multilineTextAlignment(.leading)
                }
        }
    }
}

dan dipanggil dengan navigasiLinks sebagai berikut

List(cellArray, id: \.FileID) { cell in
                if (cell.isContainer) {
                    NavigationLink(destination: FileView(path: "/\(cell.FileID)", displaysLogin: self.$displaysLogin).navigationBarTitle(cell.FileName)){
                        constructedCell(FileType: cell.FileType, FileName: cell.FileName, FileID: cell.FileID)
                    }
                } else {
                    NavigationLink(destination: DetailView(FileID: cell.FileID).navigationBarTitle(cell.FileName)){
                        constructedCell(FileType: cell.FileType, FileName: cell.FileName, FileID: cell.FileID)
                    }
                }
            }

NavigationView saya diinisialisasi dalam tampilan di atas (aplikasi memiliki tampilan tab) ini sebagai berikut

TabView(selection: $selection){
               NavigationView{
                    FileView(displaysLogin: self.$displaysLogin)
                        .navigationBarTitle("Home", displayMode: .inline)
                        .background(NavigationConfigurator { nc in
                            nc.navigationBar.barTintColor = UIColor.white
                            nc.navigationBar.titleTextAttributes = [.foregroundColor : UIColor.black]
                        })
                }
                .font(.title)
                .tabItem {
                    VStack {
                        Image(systemName: "folder.fill")
                        Text("Files")
                    }
                }
                .tag(0)
}

NavigationConfigurator adalah struct yang saya gunakan untuk menangani warna navigationBar. Sudah diatur seperti itu

struct NavigationConfigurator: UIViewControllerRepresentable {
    var configure: (UINavigationController) -> Void = { _ in }

    func makeUIViewController(context: UIViewControllerRepresentableContext<NavigationConfigurator>) -> UIViewController {
        UIViewController()
    }
    func updateUIViewController(_ uiViewController: UIViewController, context: UIViewControllerRepresentableContext<NavigationConfigurator>) {
        if let nc = uiViewController.navigationController {
            self.configure(nc)
        }
    }

}

Saya tidak berpikir NavigationConfigurator saya yang menyebabkan ini? Bug ini juga terjadi di linkLinks lain di aplikasi, tetapi paling mudah untuk menunjukkannya di sini di tampilan FileBrowser.

Ini mungkin bug di SwiftUI? Jika memang ada yang tahu cara untuk mengatasi ini? Jika tidak, apa yang saya lakukan salah?

Vapidant
sumber
Saya tidak begitu yakin. Tapi bukankah kamu harus membungkus NavigationLinkdi dalam NavigationViewdan menghapus NavigationViewdari FileView? Saya telah melihat beberapa contoh di sekitar sini yang melakukannya dengan cara itu.
Giovanni
@GiovanniTerlingen Kecuali saya salah paham dengan apa yang Anda katakan, inilah yang saya lakukan. Bagian NavigationLinkdalamnya FileViewyang terbungkus dalam NavigationViewkarenanya NavigationLinkdibungkus dalamNavigationView
Vapidant
Harap berikan proyek runnable minimum. Saya tidak dapat mereproduksi ini, jadi mungkin itu bukan salah satu bug SwiftUI.
Mojtaba Hosseini
dapatkah Anda memberikan kode sumber lengkap sehingga saya dapat menyelesaikan masalah Anda
Hardik Bar
bagaimana Anda mempersiapkan cellArray?
E.Coms

Jawaban:

5

Punya masalah yang sama - coba ini. Saya akan menyebut ini peretasan untuk dihapus ketika bug di swiftUI diperbaiki.

struct ListView: View {
@State private var destID = 0
...
var body: some View {
...
  NavigationLink(destination: FileView(path: "/\(cell.FileID)", displaysLogin: self.$displaysLogin)
   .navigationBarTitle(cell.FileName) 
   .onDisappear() { self.destID = self.destID + 1 }
  ){
   constructedCell(FileType: cell.FileType, FileName: cell.FileName, FileID: cell.FileID) 
  }.id(destID)

Pada dasarnya sepertinya dalam beberapa keadaan (iOS 13.3 - Simulator?) NavigationLink tidak diatur ulang ketika tampilan tujuan dihapus dari tumpukan navigasi. Sebagai pekerjaan di sekitar kita perlu membuat ulang Link Navigasi. Inilah yang mengubah id tidak. Ini memperbaiki masalah saya.

Namun jika Anda memiliki NavigationLinks yang dirantai, itu adalah tautan yang mengarah ke daftar tautan lain, maka solusi ini akan menciptakan efek samping; tumpukan kembali ke asal pada upaya kedua untuk menunjukkan tampilan terakhir.

VJK
sumber
Bug ini diperbaiki dalam versi iOS terbaru. Saya menandai ini sebagai jawaban yang benar karena menyelesaikan masalah yang ada, namun, ini seharusnya tidak menjadi masalah. Saya juga suka penjelasan Anda tentang masalahnya. Terima kasih.
Vapidant
Ketika Anda mengatakan versi iOS terbaru, maksud Anda 13,4 atau versi beta?
Ricardo Alves
Saya juga ingin tahu. Versi mana yang benar? Saya memiliki 13,3 (yang merupakan iOS terbaru saat ini) dan masalahnya masih ada.
mallow
Saya percaya bug ini disajikan dalam IOS 13.3 beta build tetapi telah diperbaiki pada iOS 13.3 Beta 4.
Vapidant