Если вы хотите вызвать повторный рендеринг, вам нужно использовать состояние.
Если вы поместите переменную 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)
}
}
}
Однако, если вы хотите использовать texts
для нескольких представлений, вам потребуется создать объект среды. Вы можете сделать это следующим образом:
Создать ObservableObject.
class Texts: ObservableObject {
@Published var texts = ["0", "0", "0"] // You can obviously choose whichever name you want for this variable.
}
Затем в вашем SceneDelegate создайте экземпляр этого объекта и присоедините его к вашему ContentView.
let texts = Texts()
let contentView = ContentView().environmentObject(texts)
Тогда в ContentView.swift
вы можете использовать его так:
struct ContentView: View {
@EnvironmentObject var texts: Texts
var body: some View {
List {
// notice that you have to access the texts array that is stored in texts object
Text(texts.texts[0])
Text(texts.texts[1])
Text(texts.texts[2])
}
.onAppear(){
self.texts.texts[0] = "1"
print(self.texts.texts)
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView().environmentObject(Texts())
}
}