Ответ
В SwiftUI для реакции на действия и изменения состояния используется декларативный подход с @State и привязками (Binding).
Базовое решение с @State:
struct ContentView: View {
@State private var labelText = "Исходный текст" // 1. Создаем состояние
var body: some View {
VStack {
Text(labelText) // 2. Отображаем состояние
.padding()
Button("Изменить текст") { // 3. Кнопка изменяет состояние
labelText = "Новый текст после нажатия"
}
.padding()
.background(.blue)
.foregroundColor(.white)
.cornerRadius(8)
}
}
}
Расширенный пример с кастомной оберткой кнопки:
Если нужно переиспользовать логику, можно создать компонент, принимающий замыкание действия.
struct ActionButton: View {
let title: String
let action: () -> Void // Замыкание для действия
var body: some View {
Button(title, action: action)
.padding()
.background(Color.blue)
.foregroundColor(.white)
.cornerRadius(8)
}
}
// Использование
struct ParentView: View {
@State private var infoText = "Нажми кнопку"
var body: some View {
VStack {
Text(infoText)
ActionButton(title: "Обновить") {
infoText = "Текст обновлен в (Date())"
}
}
}
}
Ключевой принцип: Изменение @State свойства автоматически вызывает перерисовку (body) всех зависимых View, что обновляет интерфейс.