相关疑难解决方法(0)

如何在 SwiftUI 中再次初始化视图?

我在我的项目中使用 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)

struct memory-management swiftui navigationlink

5
推荐指数
1
解决办法
2836
查看次数

由于 NavigationLink,SwiftUI onAppear 被多次调用

在导航链接内时,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)

swiftui

5
推荐指数
1
解决办法
910
查看次数