Работая с Xcode 15 в последней доступной версии macOS 14, У меня есть очень простая форма SwiftUI, кнопка «Сохранить» которой должна быть отключена только до тех пор, пока оба поля формы заполнены:
import SwiftUI
import SwiftData
struct AddToDoScreen: View {
@Environment(\.dismiss) private var dismiss
@Environment(\.modelContext) private var context
@State private var name: String = ""
@State private var priority: Int?
private var isFormValid: Bool {
!name.isEmpty && priority != nil
}
var body: some View {
Form {
TextField("Name", text: $name)
TextField("Priority", value: $priority, format: .number)
}
.navigationTitle("Add ToDo")
.toolbar {
ToolbarItem(placement: .topBarLeading) {
Button("Dismiss") {
dismiss()
}
}
ToolbarItem(placement: .topBarTrailing) {
Button("Save") {
guard let priority = priority else { return }
let toDo = ToDo(name: name, priority: priority)
context.insert(toDo)
do {
try context.save()
} catch {
print(error.localizedDescription)
}
dismiss()
}.disabled(!isFormValid)
}
}
}
}
Ссылка проекта на GitHub: https://github.com/atilsamancioglu/iOS50-SwiftDataToDo
Что-то не так с моим кодом или это очередная ошибка Apple? Могу ли я что-нибудь сделать в качестве исправления или обходного пути?
Ожидаете ли вы, что кнопка сохранения по-прежнему будет включена, даже если priority
равно нулю? Кнопка сохранения ничего не сделает и вернется после нажатия guard let priority = priority else { return }
Я запустил ваш код, и присвоение номера в качестве приоритета активирует кнопку сохранения, как и ожидалось. Этот вопрос должен быть закрыт как тип или аналогичный.
Вам нужно ввести номер во втором текстовом поле, так как вы использовали format: .number
. Если он не может проанализировать текст как число, он устанавливает ваше состояние Int?
на ноль, и поэтому кнопка не активируется.
К вашему сведению, я посмотрел ваш проект и было бы лучше, если бы вы перешли с sheet(isPresented:)
на sheet(item:)
. В действии кнопки создайте новый объект модели и сохраните его как @State var item
, который вы используете в качестве привязки листа. Затем в AddToDoScreen
привяжите свои текстовые поля к этому объекту вместо этих независимых состояний.
Во втором текстовом поле ожидается число. «Нормально» — это не число, поэтому
priority
— ноль.