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)
}
}
}
}
次のように、navigationLinksでビューに呼び出されます
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のバグですか?もしそうなら、誰かがこれを回避する方法を知っていますか?そうでない場合、私は何を間違っていますか?
NavigationLink
内側にあるFileView
に包まれているNavigationView
、したがってNavigationLink
のラップされ内部NavigationView
cellArray
か?
NavigationLink
の内側NavigationView
と削除NavigationView
からFileView
?私はこのようにそれを行ういくつかの例を見ました。