Сильный захват @State в закрытии приводит к повторному рендерингу тела представления [дубликат]IOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 Сильный захват @State в закрытии приводит к повторному рендерингу тела представления [дубликат]

Сообщение Anonymous »

У меня есть простая форма регистрации: когда пользователь нажимает кнопку «Продолжить», я показываю всплывающее окно, если он не вводит какие-либо поля.

Код: Выделить всё

struct ContentView: View {
@State var firstName = ""
@State var lastName = ""

@State private var validationMessage = ""
@State private var showValidationMessage = false

private var isFormValid: Bool {
!firstName.isEmpty &&
!lastName.isEmpty
}

private func checkGeneralFormCompletion() {
if isFormValid {
showValidationMessage = false
} else {
let errorText = {
if firstName.isEmpty {
return "First name empty"
} else if lastName.isEmpty {
return "Last name empty"
} else {
return ""
}
}()
validationMessage = errorText
showValidationMessage = !errorText.isEmpty
}
}

var body: some View {

VStack(spacing: 12) {
let _ = Self._printChanges()

TextField("First Name", text: $firstName)
.textFieldStyle(RoundedBorderTextFieldStyle())
.padding(.bottom, 10)

TextField("Last Name", text: $lastName)
.textFieldStyle(RoundedBorderTextFieldStyle())
.padding(.bottom, 10)

Button(action: {
checkGeneralFormCompletion()
}) {
Text("Continue")
.foregroundColor(.white)
.padding(.horizontal, 45)
.padding([.top, .bottom], 10)
.background( Color.red)
.cornerRadius(5)
}

.popover(isPresented: self.$showValidationMessage,
attachmentAnchor: .point(.top),
arrowEdge: .top,
content: { [validationMessage] in
let _ = print("validationMessage :: popover :: ", validationMessage)
VStack {
Text(validationMessage)
}
.multilineTextAlignment(.center)
.lineLimit(0)
.foregroundStyle(.black)
.font(.system(size: 18, weight: .semibold, design: .rounded))
.padding()
.presentationCompactAdaptation(.none)
.fixedSize(horizontal: false, vertical: true)
.frame(minWidth: 200)
})
.padding(.top, 70)

}
.padding()
//        .onChange(of: validationMessage) { oldValue, newValue in
//            print("CHANGE text VALIDATE MSG")
//        }
//        .onChange(of: showValidationMessage) { oldValue, newValue in
//            print("CHANGE VALIDATE MSG")
//        }
}
}
Если я закомментирую сильный захват [validationMessage] в, когда пользователь впервые нажмет кнопку, всплывающее окно отобразит пустой текст, а тело не будет перерисовано ( base при вызове _printChanges). Но если я обеспечу строгий захват для закрытия .popover или добавлю модификатор .onChange в VStack, тело будет перерисовано, и popover отобразит правильный текст.
Мой вопрос: почему, когда я обеспечиваю строгий захват @State, тело перерисовывается? Будем признательны за любые идеи и предложения!

Подробнее здесь: https://stackoverflow.com/questions/792 ... -re-render
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «IOS»