因此,我正在处理一个视图,在该视图中,我希望具有可编辑的文本,该文本只能通过按下按钮进行编辑。所以基本上,当按下";编辑";按钮,一个文本字段应该是可编辑的,并且焦点应该发送到文本字段。
以下是我如何尝试实现的:
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,结果是一样的。
是的,您需要将isEditing
与isFocusOn
分离,然后使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
将是无用的