当我通过单击后退按钮导航回视图时,.onAppear 正在调用

.onAppear is calling when I navigated back to a view by clicking back button

我有两个用 swiftUI 编写的视图,例如 ViewA 和 ViewB。 ViewA 的 onAppear() 有一个 apiCall,它在最初加载视图时调用。 我使用导航 link 从 ViewA 导航到 ViewB,然后单击 ViewB 中的后退按钮,调用 ViewA 的 onAppear()。

• 有什么方法可以在从视图导航回来时停止调用 onAppear()

• 我在 swiftUI 中寻找类似 'ViewDidLoad' 的 UIKit 给出了我的代码示例

struct ContentView: View {
    var body: some View {
        NavigationView{
            List(viewModel.list){ item in
               NavigationLink(
                destination: Text("Destination"),
                label: {
                    Text(item.name)
                })
            }
            .onAppear{
                viewModel.getListApiCall()
            }
     
        }
    }
}

您可以添加一个变量来检查是否调用了 getListApiCall()。

struct ContentView: View {
    @State var initHasRun = false
    var body: some View {
        NavigationView{
            List(viewModel.list){ item in
               NavigationLink(
                destination: Text("Destination"),
                label: {
                    Text(item.name)
                })
            }
            .onAppear{
                if !initHasRun {
                    viewModel.getListApiCall()
                    initHasRun=true
                }
            }
 
        }
    }
}

概览

  • SwiftUI 与 UIKit 的工作方式截然不同。 最好观看教程(下面的链接)以了解 SwiftUI 和 Combine 的工作原理。
  • SwiftUI 是一个声明式框架,因此我们的处理方式完全不同。最好不要寻找与 UIKit 的直接比较以获得等效功能。

型号:

  • 让模型完成所有获取和维护数据的工作
  • 确保您的模型符合ObservableObject
  • 每当 @Published 属性 发生变化时,都意味着模型已发生变化

查看:

  • 只显示模型内容
  • 通过使用 @ObservedObject / @EnvironmentObject SwiftUI 将观察模型并确保视图状态与对模型所做的任何更改同步
  • 请注意,虽然模型会在 2 秒后获取数据,但视图会对其做出反应并显示更新后的数据。

模型代码:

class Model: ObservableObject {
    
    @Published var list = [Item]()
    
    init() {
        fetchItems()
    }
    
    private func fetchItems() {
        
        //To simulate some Async API call
        DispatchQueue.main.asyncAfter(deadline: .now() + 2) { [weak self] in
            self?.list = (1...10).map { Item(name: "name \([=10=])") }
        }
    }
}

struct Item: Identifiable {
    
    var name: String
    
    var id : String {
        name
    }
}

查看代码:

import SwiftUI

struct ContentView: View {
    
    @ObservedObject var model: Model
    
    var body: some View {
        NavigationView{
            List(model.list){ item in
                NavigationLink(destination: Text("Destination")) {
                    Text(item.name)
                }
            }     
        }
    }
}

参考:

SwiftUI

合并