在 ForEach 上使用 onAppear

问题描述 投票:0回答:3

我创建了包含列表的视图,列表下是部分:

struct SwiftUIView: View {
var body: some View {
    List {
        Section {
            EmptyView()
        } header: {
            Text("Some header text")
        }
        
        NewView()
    }
}
}

NewView 和 SomeViewModel 代码:

class SomeViewModel: ObservableObject {
    @Published var data: [String] = []

    func onAppear(){
        data = ["One", "Two", "Three"]
    }
}

struct NewView: View {

     @State private var viewModel = SomeViewModel()

     var body: some View {
        ForEach(viewModel.data, id: \.self){
                Text($0)
            }
            .onAppear(perform: viewModel.onAppear)
    }
}

这里的问题是 ForEach 上没有调用 onAppear 修饰符。当我添加文本并在其上使用 onAppear 修饰符时,它就可以工作,但我不需要再添加一个视图。我也尝试使用 EmptyView,但同样,onAppear 没有被调用。有没有办法在 ForEach 上调用修饰符?

ios swiftui
3个回答
0
投票

尝试用这种方法打电话

onAppear()

struct ContentView: View {
    var body: some View {
        NewView()
    }
}

class SomeViewModel: ObservableObject {
    @Published var data: [String] = []
    
    func onAppear() {
        data = ["One", "Two", "Three"]
        print("----> in SomeViewModel onAppear")
    }
}

struct NewView: View {
    @StateObject var viewModel = SomeViewModel() // <-- here
    
    var body: some View {
        ForEach(viewModel.data, id: \.self){
            Text($0)
        }
        .onAppear{
            viewModel.onAppear()  // <-- here
        }
    }
}

0
投票

我认为你应该使用 init 而不是 onAppear 来初始化模型

class SomeViewModel: ObservableObject {
    @Published var data: [String] = []

    init() {
        data = ["One", "Two", "Three"]
    }
}

struct NewView: View {

     @State private var viewModel = SomeViewModel()

     var body: some View {
        ForEach(viewModel.data, id: \.self){
                Text($0)
        }
    }
}

0
投票

我也有同样的问题。未调用 ForEach 上的 onAppear 中的方法。当我将 ForEach 嵌入 TabView 或 VStack 中时,它工作正常。所以...

struct NewView: View {

 @State private var viewModel = SomeViewModel()

 var body: some View {
    VStack {
       ForEach(viewModel.data, id: \.self){
               Text($0)
       }
    }
    .onAppear(viewModel.onAppear)
}

}

希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.