gpt4 book ai didi

ios - 尝试重新访问之前在 SwiftUI 中单击的 NavigationLink 时,NavigationLink 卡住

转载 作者:行者123 更新时间:2023-12-02 06:46:49 25 4
gpt4 key购买 nike

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

我观察到,虽然此方法有效,但当我单击文件或文件夹然后返回并再次单击它时,导航链接不会被触发,并且我会卡在 View 上,直到单击另一个导航链接。

这是一个演示此问题的 gif。

Double Tap bug

如此处所示,当我单击 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)
}
}
}
}

并通过导航链接调用 View ,如下所示

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 在上面的 View 中初始化(应用程序有一个选项卡 View ),如下所示

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 View 中演示它。

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

最佳答案

有同样的问题 - 试试这个。我将其称为一个 hack,当 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 - 模拟器?),当目标 View 从导航堆栈中删除时,NavigationLink 不会重置。作为解决方法,我们需要重新生成导航链接。这就是更改 id 的作用。这纠正了我的问题。

但是,如果您有链接的导航链接(即指向另一个链接列表的链接),那么此解决方案将产生副作用;堆栈在第二次尝试显示最后一个 View 时返回到原点。

关于ios - 尝试重新访问之前在 SwiftUI 中单击的 NavigationLink 时,NavigationLink 卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59217265/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com