我在尝试用NavigationView替换我的NavigationStack(iOS 16+)时遇到了这种情况(出于向后兼容性原因)。我希望NavigationStack和NavigationView具有类似的行为,因为Swift UI是围绕状态管理构建的。
以下是这个问题的主要内容:
@State var examens:[Examen] = []
//...
if #available(iOS 16, *) { // Everything works well
NavigationStack {
ExamenListView(exams: examens)
.task {
xml = await dbFinder(file: "find_cr", ip: ip)
examens = await XML_to_examens(xml: xml)
}
}
} else {
NavigationView {
ExamenListView(exams:examens) // This view isn't rebuilt once the state changes
}
.navigationViewStyle(.stack) // Tried with and without
.task {
xml = await dbFinder(file: "find_cr", ip: ip)
examens = await XML_to_examens(xml: xml)
print(self.examens) // Show that examens has been updated, the call was succesful
}
}
一开始我试着重新阅读关于swift UI中导航的文档,其中,我发现了这篇文章(https://developer.apple.com/documentation/swiftui/migrating-to-new-navigation-types),但它仍然暗示NavigationView和Stack似乎是以同样的方式使用的。
然后,我试图通过分解视图来缩小问题的范围,试图将NavigationView放在ExamenListView中,在这里和那里放置print语句,但仍然没有成功。
然后,我到处移动.task块,但仍然没有成功。将它作为一个examenListView修饰符放在NavView中没有任何作用,如果我将它直接放在ExamenListView.swift中也是一样
然后,我尝试使用.id修饰符来强制更新我的视图(这是Swift Discord上的人的想法)仍然没有改变。
这是我的examenListView(我还没有符合Identifiable,我的源代码有多个id为0的对象。但即便如此,NavStack也能创造奇迹):
struct ExamenListView: View {
let exams: [Examen]
var body: some View {
Section {
List {
ForEach(exams, id: \.self) { exam in
NavigationLink(destination: ExamenDetailView(examen:exam)) {
ExamenView(examen:exam)
}
}
}
} header: {
Text("Exam List")
.font(.title)
}
}
}
1条答案
按热度按时间zzwlnbp81#
你可以尝试这个解决方法,你也忘了添加你的默认详细视图,例如。