Перепишите UIKit-форму ввода имени как SwiftUI-представление
UIKit-контроллер ниже показывает поле ввода имени, кнопку Save и сообщение об успехе, скрытое, пока пользователь не сохранит непустое имя. Перепишите его как идиоматичное SwiftUI-представление.
Требования:
- Используйте
@Stateдля имени и приветствия; никакого ручного переключенияisHidden. - Двусторонне свяжите текстовое поле; приветствие появляется только при непустом имени.
- Применяйте декларативную раскладку (
VStack/padding), а неNSLayoutConstraint.
struct NameFormView: View {
var body: some View {
// ваш код здесь
}
}
Допишите реализацию.
Замените контроллер на View с @State для имени и приветствия. TextField("Name", text: $name) связывает ввод, Button задаёт приветствие, а if !greeting.isEmpty { Text(greeting) } заменяет isHidden. VStack с padding заменяет Auto Layout.
- ✗Берут
UIViewControllerRepresentableвместо нативного SwiftUI-представления - ✗Прячут элемент флагом вместо условного включения view (
if ...) - ✗Сохраняют ручные ограничения Auto Layout вместо декларативной раскладки на стеках
- →Почему
if !greeting.isEmptyудаляет view, а не просто скрывает его? - →Как
$nameдержитTextFieldи модель синхронными без target-action?
Нативное SwiftUI-представление заменяет ~40 строк UIKit-бойлерплейта:
struct NameFormView: View {
@State private var name = ""
@State private var greeting = ""
var body: some View {
VStack(alignment: .leading, spacing: 20) {
Text("Enter your name:")
TextField("Name", text: $name)
.textFieldStyle(.roundedBorder)
Button("Save") {
greeting = name.isEmpty ? "" : "Hello, \(name)!"
}
if !greeting.isEmpty {
Text(greeting).foregroundColor(.green)
}
Spacer()
}
.padding()
}
}
$name двусторонне связывает поле с состоянием — без target-action и ручного чтения. if !greeting.isEmpty условно включает Text (view полностью покидает иерархию, а не просто скрывается), заменяя флаг isHidden. Цепочка VStack/padding заменяет все ограничения Auto Layout и бойлерплейт translatesAutoresizingMaskIntoConstraints.