标签: onappear

SwifUI onAppear 被调用两次

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)

networking list swiftui navigationlink onappear

22
推荐指数
6
解决办法
4114
查看次数

在onAppear()中调用scrollTo()并不总是有效

请参阅下面的示例代码:

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)

两个观察结果:

  1. 如果我不放入TestViewin NavigationLink(例如,直接放入ContentView),代码可以正常工作。

  2. 以下差异可以解决该问题:

                      .onAppear {
     -                    proxy.scrollTo(8, anchor: .topLeading)
     +                    DispatchQueue.main.async() {
     +                        proxy.scrollTo(8, anchor: .topLeading)
     +                    }
                      }
    
    Run Code Online (Sandbox Code Playgroud)

有谁知道根本原因是什么?解决方法表明这是一个时间问题,这解释了我的观察结果 1,其中没有导航动画。那么,是否是因为当 …

scrollview ios swiftui onappear

9
推荐指数
0
解决办法
1242
查看次数

SwiftUI .onAppear,只运行一次

在一个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块中运行一些代码,以便在应用程序出现在屏幕上、启动后或在后台一段时间后运行。但似乎这段代码只在应用启动时运行一次,之后再也不运行了。我错过了什么吗?或者我应该使用不同的策略来获得我想要的结果?

ios swift swiftui onappear

8
推荐指数
2
解决办法
3311
查看次数

当 TabView 内的 NavigationView 时 SwiftUI 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)

tabview navigationview swiftui onappear

7
推荐指数
1
解决办法
2324
查看次数

当 View 嵌套在 TabView 中时,.onAppear 没有被调用?

下面的代码正在工作(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)

ios tabview swift swiftui onappear

5
推荐指数
0
解决办法
601
查看次数