Vap*_*ant 10 ios swift swiftui swiftui-list swiftui-navigationlink
我正在设计一个应用程序,其中包括检索 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)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
并使用导航链接调用视图如下
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)
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的 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)
}
Run Code Online (Sandbox Code Playgroud)
The NavigationConfigurator is a struct I use for handling the color of the navigationBar. It is set up like so
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)
}
}
}
Run Code Online (Sandbox Code Playgroud)
I do not think my NavigationConfigurator is causing this? This bug also happens in other navigationLinks in the app, but it was easiest to demonstrate it here in the FileBrowser view.
This might be a bug in SwiftUI? If it is does anyone know a way to work around this? If it isn't, what am I doing wrong?
有同样的问题 - 试试这个。当 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)
Run Code Online (Sandbox Code Playgroud)
从本质上讲,在某些情况下(iOS 13.3 - 模拟器?),当目标视图从导航堆栈中删除时,NavigationLink 不会重置。作为一种解决方法,我们需要重新生成导航链接。这就是更改 id 的作用。这纠正了我的问题。
但是,如果您有链接的 NavigationLinks,即指向另一个链接列表的链接,那么此解决方案将产生副作用;堆栈在第二次尝试显示最后一个视图时返回原点。
| 归档时间: |
|
| 查看次数: |
844 次 |
| 最近记录: |