NavigationLink หยุดทำงานเมื่อพยายามเข้าชม NavigationLink ก่อนหน้านี้อีกครั้งใน SwiftUI


10

ฉันกำลังออกแบบแอพที่มีฟังก์ชั่นในการดึงข้อมูล JSON และแสดงรายการของรายการที่ดึงข้อมูลในมุมมองประเภท FileBrowser ในมุมมองนี้ผู้ใช้ควรสามารถคลิกที่โฟลเดอร์เพื่อดำดิ่งลึกลงไปในแผนผังไฟล์หรือคลิกที่ไฟล์เพื่อดูข้อมูลเมตาบางส่วนเกี่ยวกับไฟล์ดังกล่าว

ฉันสังเกตว่าขณะที่สิ่งนี้ใช้งานได้เมื่อฉันคลิกที่ไฟล์หรือโฟลเดอร์จากนั้นย้อนกลับไปคลิกอีกครั้ง NavigationLink ไม่ทำงานและฉันติดอยู่ที่มุมมองจนกว่าฉันจะคลิกไปที่ NavigationLink อื่น

นี่คือ gif ที่แสดงให้เห็นถึงปัญหานี้

บั๊กแตะสองครั้ง

เท่าที่เห็นที่นี่เมื่อฉันคลิกที่ BlahBlah ฉันกำลังเปิดใช้งาน NavigationLink และนำไปที่ BlahBlah จากนั้นเมื่อฉันนำทางกลับไปและพยายามที่จะลบล้างไปที่ BlahBlah มันจะกลายเป็นสีเทาลงทะเบียนว่าฉันคลิกที่มัน ... . การคลิกที่ TestFile แก้ไขปัญหานี้และอนุญาตให้ฉันนำทางกลับไปที่ BlahBlah

มีการสร้างไอเท็มรายการด้วยโครงสร้างต่อไปนี้

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

และเรียกดูด้วย navigationLinks ดังนี้

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 ของฉันถูกเตรียมใช้งานในมุมมองด้านบน (แอพมีมุมมองแท็บ) สิ่งต่อไปนี้

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 มันถูกตั้งค่าอย่างนั้น

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

}

ฉันไม่คิดว่า NavigationConfigurator ของฉันเป็นต้นเหตุของปัญหานี้หรือไม่ ข้อผิดพลาดนี้เกิดขึ้นในการนำทางลิงค์อื่น ๆ ในแอป แต่มันง่ายที่สุดที่จะแสดงให้เห็นที่นี่ในมุมมอง FileBrowser

นี่อาจเป็นข้อผิดพลาดใน SwiftUI ใช่ไหม หากไม่มีใครรู้วิธีแก้ไขปัญหานี้ ถ้าไม่ใช่ฉันทำอะไรผิด


ฉันไม่แน่ใจจริงๆ แต่คุณไม่ควรห่อNavigationLinkภายในNavigationViewและลบNavigationViewจากFileView? ฉันได้เห็นตัวอย่างรอบ ๆ ที่นี่ซึ่งเป็นอย่างนั้น
Giovanni

@GiovanniTerlingen ยกเว้นว่าฉันเข้าใจผิดในสิ่งที่คุณพูดนี่คือสิ่งที่ฉันกำลังทำอยู่ NavigationLinkด้านในFileViewซึ่งเป็นห่อNavigationViewดังนั้นNavigationLinkภายในเป็นห่อของNavigationView
Vapidant

โปรดระบุโครงการที่รันได้ต่ำสุด ฉันทำซ้ำไม่ได้ดังนั้นอาจไม่ใช่ข้อบกพร่องของ SwiftUI
Mojtaba Hosseini

คุณสามารถให้รหัสแหล่งที่มาแบบเต็มดังนั้นฉันสามารถแก้ปัญหาของคุณ
Hardik Bar

คุณเตรียมตัวcellArrayอย่างไร
E.Coms

คำตอบ:


5

มีปัญหาเดียวกัน - ลองนี้ ฉันจะเรียกมันว่าแฮ็คเพื่อลบออกเมื่อข้อผิดพลาดใน swiftUI ได้รับการแก้ไข

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)

โดยพื้นฐานแล้วดูเหมือนว่าในบางสถานการณ์ (iOS 13.3 - เครื่องมือจำลองการทำงาน) NavigationLink จะไม่รีเซ็ตเมื่อมุมมองปลายทางถูกลบออกจากสแต็กการนำทาง เพื่อหลีกเลี่ยงปัญหาดังกล่าวเราจำเป็นต้องสร้างลิงก์การนำทาง นี่คือสิ่งที่เปลี่ยน ID สิ่งนี้แก้ไขปัญหาของฉันได้

อย่างไรก็ตามหากคุณมี NavigationLinks ที่ถูกล่ามโซ่นั่นคือลิงค์ที่นำไปสู่รายการลิงค์อื่น ๆ โซลูชันนี้จะสร้างผลข้างเคียง สแต็กกลับไปที่จุดเริ่มต้นในครั้งที่สองเพื่อแสดงมุมมองสุดท้าย


ข้อผิดพลาดนี้ได้รับการแก้ไขในเวอร์ชั่น IOS ล่าสุด ฉันทำเครื่องหมายสิ่งนี้เป็นคำตอบที่ถูกต้องเนื่องจากการแก้ไขปัญหาตามที่ได้ทำไว้อย่างไรก็ตามนี่ไม่ควรเป็นปัญหา ฉันชอบคำอธิบายของปัญหา ขอบคุณ.
Vapidant

เมื่อคุณพูดเวอร์ชั่น iOS ล่าสุดคุณหมายถึง 13.4 หรือรุ่นเบต้า
Ricardo Alves

ฉันก็อยากจะรู้เช่นกัน เวอร์ชันใดที่ทำงานได้ถูกต้อง? ฉันมี 13.3 (ซึ่งเป็น iOS ล่าสุดในขณะนี้) และปัญหายังคงมีอยู่
เมลโลว์

ฉันเชื่อว่าข้อผิดพลาดนี้ถูกนำเสนอในการสร้าง IOS 13.3 เบต้า แต่ได้รับการแก้ไข ณ IOS 13.3 Beta 4
Vapidant
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.