Я розробляю додаток, який включає функцію отримання даних JSON і відображення списку отриманих елементів у вигляді подання FileBrowser. У цьому режимі користувач повинен мати можливість натиснути на папку, щоб зануритися глибше у дерево файлів або натиснути на файл, щоб переглянути деякі метадані про вказаний файл.
Я помічав, що, коли це працює, коли я клацаю на файл або папку, а потім повертаюся назад і натискаю на неї знову, NavigationLink не спрацьовує, і я застряг у перегляді, поки не натисну інший NavigationLink.
Ось подарунок, який демонструє цю проблему.
Як бачимо тут, коли я натискаю на 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 - це структура, яку я використовую для обробки кольору навігаційної смуги. Він налаштований так
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.
Це може бути помилка в SwiftUI? Якщо це хтось знає спосіб подолати це? Якщо це не так, що я роблю неправильно?
NavigationLink
Знаходиться всередині FileView
якого обгорнутий в NavigationView
тому NavigationLink
обгорнутий внутрішню частинуNavigationView
cellArray
?
NavigationLink
всерединуNavigationView
та видалитиNavigationView
зFileView
? Я бачив кілька прикладів, які роблять це саме так.