在最新可用版本的 macOS 14 上使用 Xcode 15, 我有一个非常简单的 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 错误?有什么我可以做的修复或解决方法吗?
由于您使用了
format: .number
,因此您需要在第二个文本字段中输入数字。如果它无法将文本解析为数字,则会将您的 Int?
状态设置为 nil,这就是按钮无法启用的原因。
仅供参考,我查看了您的项目,最好从
sheet(isPresented:)
切换到 sheet(item:)
。在按钮操作中创建新的模型对象,将其存储为用作工作表装订的 @State var item
。然后在 AddToDoScreen
将文本字段绑定到该对象,而不是那些独立的状态。