Projektuję aplikację, która zawiera funkcję pobierania danych JSON i wyświetlania listy pobranych elementów w widoku typu FileBrowser. W tym widoku użytkownik powinien mieć możliwość kliknięcia folderu w celu głębszego zanurzenia się w drzewie plików lub kliknięcia pliku, aby wyświetlić metadane dotyczące tego pliku.
Zauważyłem, że kiedy to działa, kiedy klikam plik lub folder, a następnie wracam i klikam go ponownie, NavigationLink nie jest wyzwalany i utknąłem na widoku, dopóki nie kliknę w inny NavigationLink.
Oto gif demonstrujący ten problem.
Jak widać tutaj, kiedy klikam BlahBlah, aktywuję NavigationLink i zabieram się do BlahBlah, a następnie, gdy nawiguję z powrotem i próbuję ponownie nawigować do BlahBlah, robi się szary, rejestrując, że kliknąłem na niego ... ale nigdy mnie tam nie przenosi . Kliknięcie TestFile naprawia to i pozwala mi wrócić do BlahBlah.
Elementy listy są tworzone za pomocą następujących struktur
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)
}
}
}
}
i wywoływane w widoku z NavigationLinks w następujący sposób
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)
}
}
}
Mój widok nawigacji jest inicjowany w powyższym widoku (aplikacja ma widok zakładki) w następujący sposób
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 to struktura, której używam do obsługi koloru paska nawigacji. Jest tak skonfigurowane
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)
}
}
}
Nie sądzę, że mój konfigurator nawigacji powoduje to? Ten błąd występuje również w innych linkach do nawigacji w aplikacji, ale najłatwiej było go zademonstrować tutaj w widoku FileBrowser.
To może być błąd w SwiftUI? Jeśli tak, to czy ktoś zna sposób na obejście tego? Jeśli nie, co robię źle?
NavigationLink
jest w środku, FileView
jest owinięte, NavigationView
dlatego NavigationLink
jest owinięte wNavigationView
cellArray
?
NavigationLink
WewnątrzNavigationView
i usunąćNavigationView
zFileView
? Widziałem kilka przykładów, które robią to w ten sposób.