当我通过单击后退按钮导航回视图时,.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
- https://developer.apple.com/videos/play/wwdc2020/10119
- https://developer.apple.com/videos/play/wwdc2020/10037
- https://developer.apple.com/videos/play/wwdc2020/10040
合并
我有两个用 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
- https://developer.apple.com/videos/play/wwdc2020/10119
- https://developer.apple.com/videos/play/wwdc2020/10037
- https://developer.apple.com/videos/play/wwdc2020/10040