swift NavigationView在@State更改时不更新(NavigationStack工作正常)

nafvub8i  于 2023-05-28  发布在  Swift
关注(0)|答案(1)|浏览(126)

我在尝试用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)
            }
    }
}
zzwlnbp8

zzwlnbp81#

你可以尝试这个解决方法,你也忘了添加你的默认详细视图,例如。

NavigationView { [examens] in
       ExamenListView(exams:examens) // This view isn't rebuilt once the state changes
       Text("Make a selection") // required
    }

相关问题