NavigationLink đóng băng khi cố gắng xem lại NavigationLink đã nhấp trước đó trong SwiftUI


10

Tôi đang thiết kế một ứng dụng bao gồm chức năng truy xuất dữ liệu JSON và hiển thị danh sách các mục được truy xuất trong chế độ xem loại FileBrowser. Theo quan điểm này, người dùng sẽ có thể nhấp vào thư mục để đi sâu hơn vào cây tệp hoặc nhấp vào tệp để xem một số siêu dữ liệu về tệp đã nói.

Tôi đã quan sát thấy rằng trong khi điều này đang hoạt động, khi tôi nhấp vào một tệp hoặc thư mục rồi quay lại và nhấp vào nó một lần nữa, NavigationLink không được kích hoạt và tôi bị kẹt trên màn hình cho đến khi tôi nhấp vào một NavigationLink khác.

Đây là một gif chứng minh vấn đề này.

Lỗi nhấn đúp

Như đã thấy ở đây, khi tôi nhấp vào BlahB nhớ, tôi đang kích hoạt Điều hướng Liên kết và đưa đến BlahB nhớ, sau đó khi tôi điều hướng trở lại và cố gắng đổi tên thành BlahBlah, nó sẽ chuyển sang màu xám, nhưng sau đó tôi không bao giờ chuyển tôi đến đó ... . Nhấp vào TestFile sẽ khắc phục điều này và cho phép tôi điều hướng trở lại BlahB nhớ.

Các mục danh sách được thực hiện với các cấu trúc sau

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

và được gọi vào xem với navigationLinks như sau

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

Điều hướng của tôi được khởi tạo trong chế độ xem ở trên (ứng dụng có chế độ xem tab) như sau

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 là một cấu trúc tôi sử dụng để xử lý màu của navigationBar. Nó được thiết lập như vậy

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

}

Tôi không nghĩ NavigationConfigurator của tôi gây ra điều này? Lỗi này cũng xảy ra trong các điều hướng liên kết khác trong ứng dụng, nhưng dễ nhất là thể hiện nó ở đây trong chế độ xem FileBrowser.

Đây có thể là một lỗi trong SwiftUI? Nếu có ai biết một cách để làm việc này không? Nếu không, tôi đang làm gì sai?


Tôi không thực sự chắc chắn. Nhưng bạn không nên bọc NavigationLinkbên trong NavigationViewvà loại bỏ NavigationViewkhỏi FileView? Tôi đã thấy một số ví dụ xung quanh đây làm điều đó theo cách đó.
Giovanni

@GiovanniT Muffen Trừ khi tôi hiểu nhầm những gì bạn đang nói, đây là những gì tôi đang làm. Phần NavigationLinkbên trong FileViewđược bọc trong NavigationViewdo đó NavigationLinkđược bọc bên trongNavigationView
Vapidant

Vui lòng cung cấp một dự án runnable tối thiểu. Tôi không thể tái tạo điều này, vì vậy có lẽ đó không phải là một trong những lỗi của SwiftUI.
Mojtaba Hosseini

bạn có thể cung cấp mã nguồn đầy đủ để tôi có thể giải quyết vấn đề của bạn không
Hardik Bar

bạn đã chuẩn bị cellArraynhư thế nào
E.Coms

Câu trả lời:


5

Có cùng một vấn đề - hãy thử điều này. Tôi sẽ gọi đây là một bản hack để được gỡ bỏ khi lỗi trong swiftUI được sửa chữa.

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)

Về cơ bản, dường như trong một số trường hợp (iOS 13.3 - Trình mô phỏng?), NavigationLink không được đặt lại khi chế độ xem đích bị xóa khỏi ngăn xếp điều hướng. Như một công việc xung quanh, chúng ta cần tạo lại Liên kết Điều hướng. Đây là những gì thay đổi id làm. Điều này đã khắc phục vấn đề của tôi.

Tuy nhiên, nếu bạn có NavigationLinks bị xiềng xích, đó là một liên kết dẫn đến một danh sách liên kết khác, thì giải pháp này sẽ tạo ra các tác dụng phụ; ngăn xếp trở về điểm gốc ở lần thử thứ hai để hiển thị khung nhìn cuối cùng.


Lỗi này được sửa trong phiên bản iOS mới nhất. Tôi đánh dấu đây là câu trả lời đúng vì giải quyết vấn đề như hiện tại, tuy nhiên, đây không phải là một vấn đề. Tôi cũng thích lời giải thích của bạn về vấn đề này. Cảm ơn bạn.
Vapidant

Khi bạn nói phiên bản iOS mới nhất, bạn có nghĩa là 13.4 hay phiên bản beta?
Ricardo Alves

Tôi cũng muốn biết Phiên bản nào hoạt động chính xác? Tôi có 13.3 (là iOS mới nhất hiện tại) và vấn đề vẫn còn đó.
mallow

Tôi tin rằng lỗi này đã được trình bày trong bản dựng iOS 13.3 beta nhưng đã được sửa chữa kể từ phiên bản iOS 13.3 Beta 4.
Vapidant
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.