同时启用和聚焦文本字段时出现问题

Problem enabling and focusing a text field at the same time

所以我正在处理一个视图,我想在其中拥有可编辑的文本,该文本只能通过按下按钮才能编辑。所以基本上,当按下“编辑”按钮时,应该使文本字段可编辑,焦点应该发送到文本字段。

以下是我尝试实现的方法:

struct MyView: View {
    @Binding var text: String
    @FocusState var isEditing
    var body: some View {
        HStack {
            TextField("Text", text: $text)
                .disabled(!isEditing)
                .focused($isEditing)
            Spacer()
            
            Button(isEditing ? "Done" : "Edit") {
                isEditing.toggle()
            }
        }
    }
}

因此,如果我注释掉 .disabled 行,焦点行为将按预期工作。但是,当存在禁用调用时,按下编辑按钮不会启用或聚焦文本字段。

我最好的猜测是该字段可能因为最初被禁用而无法聚焦?

有什么方法可以实现这种行为吗?我也尝试过使用单独的 @State var 来禁用它,结果相同。

是的,你需要将 isEditingisFocusOn 分开,然后让 isFocusOn 像这样依赖于 isEditing

由@sak 请求更新:更改焦点编辑

struct MyView: View {
    @Binding var text: String = ""
    @State private var isEditing: Bool = false
    @FocusState var isFocusOn: Bool
    var body: some View {
        HStack {
            if isEditing {
                TextField("Text", text: $text)
                    .focused($isFocusOn)
                    .onAppear {
                        DispatchQueue.main.async {
                            isFocusOn = true
                        }
                    }
            } else {
                TextField("Text", text: $text)
                    .disabled(true)
            }
            Spacer()
            Button(isEditing ? "Done" : "Edit") {
                isEditing.toggle()
            }
        }
        .onChange(of: isFocusOn) { newValue in
            if !newValue { isEditing = false }
        }
    }
}

注意edit = true不要在焦点上设置,否则disabled就没用了