SwiftUI'de daha önce tıklanan NavigationLink'i tekrar ziyaret etmeye çalışırken NavigationLink donuyor


10

JSON verilerini alma ve bir FileBrowser türü görünümünde alınan öğelerin bir listesini görüntüleme işlevini içeren bir uygulama tasarlıyorum. Bu görünümde, kullanıcı dosya ağacına daha derinlemesine dalmak için bir klasörü veya söz konusu dosyayla ilgili bazı meta verileri görüntülemek için bir dosyayı tıklayabilmelidir.

Bu çalışırken, bir dosya veya klasörü tıklayıp sonra geri dönüp tekrar tıkladığımda, NavigationLink'in tetiklenmediğini ve farklı bir NavigationLink'i tıklayana kadar görünümde sıkıştığımı gözlemledim.

İşte bu sorunu gösteren bir gif.

Çift Dokunma hatası

Burada görüldüğü gibi, BlahBlah'ı tıkladığımda, NavigationLink'i etkinleştiriyorum ve BlahBlah'a götürüyorum, o zaman geri dönüp BlahBlah'a yeniden gitmeye çalıştığımda gri oluyor, üzerine tıkladığımı kaydederek ... . TestFile'a tıklamak bunu düzeltir ve BlahBlah'a geri dönmemi sağlar.

Liste öğeleri aşağıdaki yapılarla yapılır

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

ve aşağıdaki gibi navigationLinks ile görünüme çağrıldı

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

My NavigationView yukarıdaki görünümde başlatıldı (uygulamanın sekme görünümü var) bu aşağıdaki gibi

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, navigationBar rengini işlemek için kullandığım bir yapıdır. Bu şekilde kurulmuş

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

}

Benim NavigationConfigurator buna neden olduğunu sanmıyorum? Bu hata, uygulamadaki diğer navigasyon bağlantılarında da olur, ancak burada FileBrowser görünümünde göstermek en kolay yoldur.

Bu SwiftUI'de bir hata olabilir mi? Eğer öyleyse, kimse bu sorunu çözmek için bir yol biliyor mu? Değilse, neyi yanlış yapıyorum?


Ben gerçekten emin değilim. Ama sarmak olmamalıdır NavigationLinkbir iç NavigationViewve kaldırmak NavigationViewgelen FileView? Buralarda bunu yapan bazı örnekler gördüm.
Giovanni

@GiovanniTerlingen Söylediklerinizi yanlış anlayamadıkça, yaptığım da bu. NavigationLinkİçinde olan FileViewbir sarılmış olan NavigationView, bu nedenle NavigationLink, bir sarılmış olan içNavigationView
Vapidant

Lütfen asgari çalıştırılabilir bir proje sağlayın. Bunu çoğaltamıyorum, bu yüzden muhtemelen SwiftUI'nin hatalarından biri değil.
Mojtaba Hosseini

Sorununuzu çözebilmeniz için tam kaynak kodu sağlayabilir misiniz?
Hardik Bar

nasıl hazırlandınız cellArray?
E.Coms

Yanıtlar:


5

Aynı sorun vardı - bunu deneyin. Ben swiftUI hata düzeltildiğinde kaldırılması için bir kesmek denir.

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)

Esasen, bazı durumlarda (iOS 13.3 - Simulator?), Hedef görünüm gezinme yığınından kaldırıldığında NavigationLink'in sıfırlanmadığı görülmektedir. Bir çözüm olarak Gezinti Bağlantısını yeniden oluşturmamız gerekiyor. Kimliği değiştirmek budur. Bu sorunumu düzeltti.

Ancak zincirlenmiş NavigationLinks'ınız varsa, bu başka bir bağlantı listesine götüren bir bağlantıdır, o zaman bu çözüm yan etkiler yaratacaktır; yığın, son görünümü göstermek için ikinci denemede başlangıç ​​noktasına geri döner.


Bu hata en son IOS sürümünde düzeltildi. Sorunu olduğu gibi çözdüğü için bunu doğru cevap olarak işaretliyorum, ancak bu bir sorun olmamalı. Sorunu açıklamanızı da seviyorum. Teşekkür ederim.
Vapidant

En son iOS sürümünü söylediğinizde, 13.4 veya beta sürümü mü demek istediniz?
Ricardo Alves

Ben de bilmek istiyorum. Hangi sürüm doğru çalışıyor? 13.3'üm var (şu anda en son iOS) ve sorun hala var.
ebegümeci

Bu hatanın bir IOS 13.3 beta derlemesinde sunulduğuna inanıyorum, ancak IOS 13.3 Beta 4'ten beri düzeltildi.
Vapidant
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.