На самом деле, переменная действительно обновляется, но ваше представление контента не получает информацию об этом. Вот что происходит:
- вызывается ContentView, он инициализирует ColoredLabel с ExampleView
- при нажатии кнопки в ContentView
- self.coloredLabel.updateMessage () get вызывается
- сообщение печатается
- переменная self.coloredLabel.message изменена
- ContentView не перерисовывается, так как он не уведомлен об изменении
- , более конкретно, ColoredLabel внутри вашего стека не обновляется
сейчас, у вас есть различные варианты: @State
, @Binding
и @PublishedObject, @ObservedObject
. Вам нужен один из этих издателей, поэтому ваш взгляд на самом деле замечает, что он должен что-то делать.
Либо вы рисуете новый ExampleView
каждый раз, когда нажимаете кнопку, в этом случае вы можете использовать @State
переменная в ContentView
:
struct ContentView: View {
@State private var string = "Hello"
var body: some View {
VStack {
ExampleView(message: string)
.foregroundColor(Color.red)
.padding()
Button(action: {
self.string = "Updated"
}) {
Text("Press me")
}
}
}
}
struct ExampleView: View {
var message: String
var body: some View {
Text(self.message)
}
}
, что, вероятно, не то, что вы хотите.
Далее, вы можете использовать @ Binding , который уже был предложен.
И, наконец, вы можете использовать ObservableObject @ObservedObject, @ Опубликовано
class ExampleState: ObservableObject {
@Published var message: String = "Hello"
func update() {
message = "Updated"
}
}
struct ContentView: View {
@ObservedObject var state = ExampleState()
var body: some View {
VStack {
ExampleView(state: state)
.foregroundColor(Color.red)
.padding()
Button(action: {
self.state.update()
}) {
Text("Press me")
}
}
}
}
struct ExampleView: View {
@ObservedObject var state: ExampleState
var body: some View {
Text(state.message)
}
}
что это говорит: class ExampleState: ObservableObject
- этот класс имеет опубликованные переменные, которые можно наблюдать
чтобы возобновить (вот как я понимаю):
- "Эй,
ContentView
и ExampleView
: если state.message
(любое значение, которое публикуется state
) изменится, вы нужно перерисовать ваше тело " - " и
ExampleState
: после обновления вашей переменной сообщения опубликуйте sh новое значение! "
наконец - для завершения - есть @EnvironmentObject
, таким образом, вам нужно будет только передать переменную в верхние виды, и все вниз по иерархии представлений буду наследовать.