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

aji*_*ark 6 swiftui swiftui-navigationlink

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

\n

\xe2\x80\xa2 从视图导航回来时有什么方法可以停止调用 onAppear()

\n

\xe2\x80\xa2 我正在 swiftUI 中寻找 UIKit 中类似“ViewDidLoad”的东西\n给定我的代码示例

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

use*_*037 3

概述

  • SwiftUI 与 UIKit 的工作方式有很大不同。最好观看教程(下面的链接)以了解 SwiftUI 和合并的工作原理。
  • 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 \($0)") }
        }
    }
}

struct Item: Identifiable {
    
    var name: String
    
    var id : String {
        name
    }
}
Run Code Online (Sandbox Code Playgroud)

查看代码:

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)
                }
            }     
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

参考:

斯威夫特用户界面

结合