如何在Swift UI中强制onAppear上的视图更新

时间:2019-10-19 10:26:16

标签: swift swiftui

是否可以在Appear上查看内容视图?该方法被调用,但列表未更新 似乎应该采取某种方式

import SwiftUI

var texts = ["0", "0", "0"]

struct ContentView: View {


  var body: some View {
      List {
        Text(texts[0])
        Text(texts[1])
        Text(texts[2])

      }
      .onAppear(){
        texts[0] = "1"
        print(texts)
    }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

2 个答案:

答案 0 :(得分:0)

如果要在变量更改时更新视图并将其放置在视图中,则应为@State

  @State var texts = ["0", "0", "0"]

答案 1 :(得分:0)

如果要进行重新渲染,则需要使用状态。

如果将SELECT TOP(10000) * INTO #A变量带入texts结构中,并将其声明为ContentView,那么它将导致@State重新呈现。

请注意,在闭包中引用ContentView时,必须在self中使用onAppear

texts

但是,如果您希望跨多个视图共享struct ContentView: View { @State private var texts = ["0", "0", "0"] . // Apple suggests that these should be private var body: some View { List { Text(texts[0]) Text(texts[1]) Text(texts[2]) } .onAppear(){ self.texts[0] = "1" print(self.texts) } } } ,则需要创建一个环境对象。您可以按照以下步骤进行操作:

创建一个ObservableObject。

texts

然后在SceneDelegate中创建此对象的实例,并将其附加到ContentView。

class Texts: ObservableObject {
    @Published var texts = ["0", "0", "0"] // You can obviously choose whichever name you want for this variable.
}

然后在let texts = Texts() let contentView = ContentView().environmentObject(texts) 中,您可以像这样使用它:

ContentView.swift