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



因此,我正在处理一个视图,在该视图中,我希望具有可编辑的文本,该文本只能通过按下按钮进行编辑。所以基本上,当按下";编辑";按钮,一个文本字段应该是可编辑的,并且焦点应该发送到文本字段。

以下是我如何尝试实现的:

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来表示disabled,结果是一样的。

是的,您需要将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将是无用的

最新更新