我在我的项目中使用 SwfitUI,我有一个 NavigationView 和 List。我在打开详细视图后单击单元格并单击导航返回按钮。单击导航后退按钮后,我想删除视图(它是结构,在 SwiftUI 中)。因为如果我再次单击同一个单元格或按钮,它不会初始化新视图,而是显示旧视图。我想刷新这个视图。我该怎么办?
我的 FirstView 结构是:
struct FirstView: View {
@ObservedObject var viewModel: FirstViewModel
var body: some View {
List(self.viewModel.objects, id: \.id) { object in
ZStack {
DetailViewCell(object: object)
NavigationLink(destination: DetailViewBuilder.make(object)) {
EmptyView()
}.buttonStyle(PlainButtonStyle())
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的 DetailView 结构是:
struct DetailView: View {
@ObservedObject var viewModel: DetailViewModel
var body: some View {
ZStack(alignment: .top) {
Color.mainBackground.edgesIgnoringSafeArea(.all)
VStack {
ZStack {
Image("Square")
Image(self.viewModel.currentImage)
}
Text(self.viewModel.currentText)
.padding()
.frame(alignment: .center)
.minimumScaleFactor(0.1)
Spacer()
Button(action: {
self.viewModel.pressedPlayOrPauseButton()
}, label: …Run Code Online (Sandbox Code Playgroud) 在导航链接内时,SwiftUI onAppear 被多次调用。在我提供的示例中,它被调用了 5 次。这也会触发它的 StateObject 初始值设定项也被调用 5 次。如果您注释掉导航链接,它会按预期执行。
这已经在 Xcode 12 GM 和 Xcode 12.2 以及 iOS 14 GM 和 iOS 14.2 beta 1 上进行了测试。也作为反馈 FB8721761 提交。
struct ContentView: View {
var body: some View {
NavigationLink(destination: Color.red, label: {
ImageView()
.frame(width: 166.66, height: 250)
.cornerRadius(10)
})
}
}
struct ImageView: View{
@StateObject private var downloader = Downloaded(url: URL(string: "https://image.tmdb.org/t/p/w342/TnOeov4w0sTtV2gqICqIxVi74V.jpg")!)
var body: some View{
Rectangle()
.onAppear{
print("Appeared")
}
}
}
class Downloaded: ObservableObject{
var cancellable: AnyCancellable?
let url: URL …Run Code Online (Sandbox Code Playgroud)