Saya merancang aplikasi yang mencakup fungsi mengambil data JSON dan menampilkan daftar item yang diambil dalam tampilan jenis FileBrowser. Dalam tampilan ini, pengguna harus dapat mengklik folder untuk menyelam lebih dalam ke pohon file atau klik pada file untuk melihat beberapa metadata tentang file tersebut.
Saya telah mengamati bahwa sementara ini berfungsi, ketika saya mengklik file atau folder kemudian kembali dan mengkliknya lagi, NavigationLink tidak terpicu dan saya terjebak pada tampilan sampai saya mengklik pada NavigationLink yang berbeda.
Berikut adalah gif yang menunjukkan masalah ini.
Seperti yang terlihat di sini, ketika saya mengklik BlahBlah saya mengaktifkan NavigationLink dan dibawa ke BlahBlah, kemudian ketika saya menavigasi kembali dan mencoba untuk renavigate ke BlahBlah, itu menjadi abu-abu, mendaftar bahwa saya mengkliknya ... tetapi kemudian tidak pernah membawa saya ke sana . Mengklik TestFile memperbaiki ini dan memungkinkan saya untuk menavigasi kembali ke BlahBlah.
Daftar item dibuat dengan struct berikut
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)
}
}
}
}
dan dipanggil dengan navigasiLinks sebagai berikut
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 saya diinisialisasi dalam tampilan di atas (aplikasi memiliki tampilan tab) ini sebagai berikut
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 adalah struct yang saya gunakan untuk menangani warna navigationBar. Sudah diatur seperti itu
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)
}
}
}
Saya tidak berpikir NavigationConfigurator saya yang menyebabkan ini? Bug ini juga terjadi di linkLinks lain di aplikasi, tetapi paling mudah untuk menunjukkannya di sini di tampilan FileBrowser.
Ini mungkin bug di SwiftUI? Jika memang ada yang tahu cara untuk mengatasi ini? Jika tidak, apa yang saya lakukan salah?
sumber
NavigationLink
di dalamNavigationView
dan menghapusNavigationView
dariFileView
? Saya telah melihat beberapa contoh di sekitar sini yang melakukannya dengan cara itu.NavigationLink
dalamnyaFileView
yang terbungkus dalamNavigationView
karenanyaNavigationLink
dibungkus dalamNavigationView
cellArray
?Jawaban:
Punya masalah yang sama - coba ini. Saya akan menyebut ini peretasan untuk dihapus ketika bug di swiftUI diperbaiki.
Pada dasarnya sepertinya dalam beberapa keadaan (iOS 13.3 - Simulator?) NavigationLink tidak diatur ulang ketika tampilan tujuan dihapus dari tumpukan navigasi. Sebagai pekerjaan di sekitar kita perlu membuat ulang Link Navigasi. Inilah yang mengubah id tidak. Ini memperbaiki masalah saya.
Namun jika Anda memiliki NavigationLinks yang dirantai, itu adalah tautan yang mengarah ke daftar tautan lain, maka solusi ini akan menciptakan efek samping; tumpukan kembali ke asal pada upaya kedua untuk menunjukkan tampilan terakhir.
sumber