我创建了包含列表的视图,列表下是部分:
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 上调用修饰符?
尝试用这种方法打电话
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
}
}
}
我认为你应该使用 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)
}
}
}
我也有同样的问题。未调用 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)
}
}
希望这有帮助。