SwiftUI Bool 状态未更新或不正确

问题描述 投票:0回答:1

在最新可用版本的 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 错误?有什么我可以做的修复或解决方法吗?

swift swiftui state state-management
1个回答
0
投票

由于您使用了

format: .number
,因此您需要在第二个文本字段中输入数字。如果它无法将文本解析为数字,则会将您的
Int?
状态设置为 nil,这就是按钮无法启用的原因。

仅供参考,我查看了您的项目,最好从

sheet(isPresented:)
切换到
sheet(item:)
。在按钮操作中创建新的模型对象,将其存储为用作工作表装订的
@State var item
。然后在
AddToDoScreen
将文本字段绑定到该对象,而不是那些独立的状态。

© www.soinside.com 2019 - 2024. All rights reserved.