尝试重新访问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 包裹起来NavigationView并NavigationView从中删除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.