簡體   English   中英

嘗試在 SwiftUI 中重新訪問之前單擊的 NavigationLink 時,NavigationLink 凍結

[英]NavigationLink freezes when trying to revisit previously clicked NavigationLink in SwiftUI

我正在設計一個應用程序,其中包括檢索 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)
                }
        }
    }
}

並使用導航鏈接調用視圖如下

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 是我用來處理導航欄顏色的結構。 它是這樣設置的

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 中的一個錯誤? 如果是的話,有人知道解決這個問題的方法嗎? 如果不是,我做錯了什么?

有同樣的問題 - 試試這個。 當 swiftUI 中的錯誤得到糾正時,我會將其稱為要刪除的 hack。

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,即指向另一個鏈接列表的鏈接,那么此解決方案將產生副作用; 堆棧在第二次嘗試顯示最后一個視圖時返回原點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM