Q1:为什么 onAppears 会被调用两次?
Q2:或者,我可以在哪里拨打网络电话?
我在代码中的几个不同位置放置了 onAppears,它们都被调用了两次。最终,我试图在显示下一个视图之前进行网络调用,所以如果您知道不使用 onAppear 的方法,我会全力以赴。
我还尝试在我的列表中放置和删除 ForEach,但它没有改变任何东西。
Xcode 12 Beta 3 -> Target iOs 14 CoreData 已启用但尚未使用
struct ChannelListView: View {
@EnvironmentObject var channelStore: ChannelStore
@State private var searchText = ""
@ObservedObject private var networking = Networking()
var body: some View {
NavigationView {
VStack {
SearchBar(text: $searchText)
.padding(.top, 20)
List() {
ForEach(channelStore.allChannels) { channel in
NavigationLink(destination: VideoListView(channel: channel)
.onAppear(perform: {
print("PREVIOUS VIEW ON APPEAR")
})) {
ChannelRowView(channel: channel)
}
}
.listStyle(GroupedListStyle())
}
.navigationTitle("Channels")
}
}
} …Run Code Online (Sandbox Code Playgroud) 请参阅下面的示例代码:
struct TestView: View {
var body: some View {
ScrollViewReader { proxy in
List {
ForEach(1...30, id: \.self) { item in
Text("\(item)")
.id(item)
}
}
.onAppear {
proxy.scrollTo(8, anchor: .topLeading)
}
}
}
}
struct ContentView: View {
var body: some View {
NavigationView {
NavigationLink("test") {
TestView()
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
两个观察结果:
如果我不放入TestViewin NavigationLink(例如,直接放入ContentView),代码可以正常工作。
以下差异可以解决该问题:
.onAppear {
- proxy.scrollTo(8, anchor: .topLeading)
+ DispatchQueue.main.async() {
+ proxy.scrollTo(8, anchor: .topLeading)
+ }
}
Run Code Online (Sandbox Code Playgroud)
有谁知道根本原因是什么?解决方法表明这是一个时间问题,这解释了我的观察结果 1,其中没有导航动画。那么,是否是因为当 …
在一个SwiftUI应用程序中,我有这样的代码:
var body: some View {
VStack {
Spacer()
........
}
.onAppear {
.... I want to have some code here ....
.... to run when the view appears ....
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是我想在.onAppear块中运行一些代码,以便在应用程序出现在屏幕上、启动后或在后台一段时间后运行。但似乎这段代码只在应用启动时运行一次,之后再也不运行了。我错过了什么吗?或者我应该使用不同的策略来获得我想要的结果?
所以我有一个 TabView,其中每个选项卡都嵌入在 NavigationView 中。在每个选项卡第一次出现时,我都会收到以下生命周期调用 onAppear()、onDisappear()、onAppear()。所以看起来 onAppear 被调用了两次。这只会发生第一次。如果我导航回同一个选项卡,则只会调用 onAppear(),而且只会调用一次。
这是一个最小的例子:
struct Page1: View {
init() { print("Page 1 init") }
var body: some View {
NavigationView {
Text("Page 1")
.onAppear(perform: { print("Page 1 appearing") })
.onDisappear(perform: { print("Page 1 disappearing") })
}
}
}
struct Page2: View {
init() { print("Page 2 init") }
var body: some View {
NavigationView {
Text("Page 2")
.onAppear(perform: { print("Page 2 appearing") })
.onDisappear(perform: { print("Page 2 disappearing") })
}
}
}
struct ContentView: View …Run Code Online (Sandbox Code Playgroud) 下面的代码正在工作(onAppear 被调用)但是一旦我将我的两个视图嵌套在一个 tabView 中(以呈现类似 UIPageViewController 的 UI),第二个视图的 onAppear 函数就永远不会被调用,这是一个错误还是我在做什么做错了吗?
struct SetUpWorkoutView: View {
var body: some View {
NavigationView {
List {
ForEach(sessionTypes) { sessionType in
NavigationLink(destination: LiveWorkoutView(sessionType: sessionType)) {
SessionTypeRow(name: sessionType.stringValue)
}
}
}
}
struct LiveWorkoutView: View {
var body: some View {
VStack(alignment: .leading) { }
}.onAppear(perform: {
print("on appear called in LiveWorkoutView")
}
}
}
}
@main
struct SwiftUITestApp: App {
var body: some Scene {
WindowGroup {
TabView {
SetUpWorkoutView()
WatchSettingsView()
}
.tabViewStyle(PageTabViewStyle())
}
} …Run Code Online (Sandbox Code Playgroud)