尝试重新访问SwiftUI中先前单击的NavigationLink时,NavigationLink冻结


10

我正在设计一个应用程序,该应用程序包括检索JSON数据并在FileBrowser类型视图中显示检索到的项目的列表的功能。在此视图中,用户应该能够单击文件夹以更深入地进入文件树,或者单击文件以查看有关该文件的一些元数据。

我观察到,在这种情况下,当我单击文件或文件夹然后再次单击并单击它时,不会触发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是我用于处理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引起了这个问题?该错误也发生在应用程序中的其他NavigationLinks中,但在FileBrowser视图中最简单地演示它。

这可能是SwiftUI中的错误吗?如果是,是否有人知道解决此问题的方法?如果不是,我在做什么错?


我不太确定 但是,您是否不应该将NavigationLinka 包裹起来NavigationViewNavigationView从中删除FileView?我在这里看到了一些这样做的例子。
乔凡尼

@GiovanniTerlingen除非我误解了你在说什么,否则这就是我在做什么。的NavigationLink是的内部FileView,其被包裹在一NavigationView因此NavigationLink一个被包裹在里面NavigationView
Vapidant

请提供一个最小的可运行项目。我无法重现此内容,因此它可能不是SwiftUI的错误之一。
Mojtaba Hosseini

你可以提供完整的源代码,这样我就可以解决您的问题
Hardik酒吧

你是怎么准备的cellArray
E.Coms

Answers:


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-Simulator?),从导航堆栈中删除目标视图时,不会重置NavigationLink。作为解决方法,我们需要重新生成导航链接。这就是更改id的作用。这解决了我的问题。

但是,如果您具有链接的NavigationLinks,即链接指向另一个链接列表的链接,则此解决方案将产生副作用;否则,可能会产生副作用。在第二次尝试显示最后一个视图时,堆栈将返回到原点。


此错误已在最新的IOS版本中修复。我将其标记为正确的答案,因为它可以解决当前的问题,但是,这不应该成为问题。我也喜欢您对问题的解释。谢谢。
-Vapidant

当您说最新的iOS版本时,是指13.4还是Beta版?
里卡多·阿尔维斯

我也想知道。哪个版本正确?我有13.3(目前是最新的iOS),问题仍然存在。
锦葵

我相信此错误是在IOS 13.3 Beta版本中提出的,但已从IOS 13.3 Beta 4开始修复
。– Vapidant
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.