Не меняя FormView, сбросьте его identity через .id: SwiftUI создаст новое состояние формы с пустыми строками.
struct ExampleView: View {
Не меняя FormView, сбросьте его identity через .id: SwiftUI создаст новое состояние формы с пустыми строками.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
struct ExampleView: View { var body: some View { VStack { FormView() Button("Reset") { // TODO: } } } }
// ТОЛЬКО ДЛЯ ЧТЕНИЯ struct FormView: View { @State private var firstname = "" @State private var lastname = "" @State private var email = "" @State private var website = ""
var body: some View {
Form {
TextField("Введите имя", text: self.$firstname)
TextField("Введите фамилию", text: self.$lastname)
TextField("Введите адрес электронной почты", text: self.$email)
TextField("Введите адрес сайта", text: self.$website)
}
}
}
Ответ
Не меняя FormView, сбросьте его identity через .id: SwiftUI создаст новое состояние формы с пустыми строками.
Добавьте идентификатор в родительский экран и меняйте его только по нажатию:
struct ExampleView: View {
@State private var formID = UUID()
var body: some View {
VStack {
FormView().id(formID)
Button("Reset") { formID = UUID() }
}
}
}
Это сбрасывает все локальные @State дочерней формы, а не обращается к её private-полям. Одновременно теряются и другие состояния поддерева, например фокус. Если допустимо менять FormView, более управляемый вариант — вынести данные формы в модель и передавать bindings.
Источник: developer.apple.com.