同时启用和聚焦文本字段时出现问题
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 来禁用它,结果相同。
是的,你需要将 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
就没用了
所以我正在处理一个视图,我想在其中拥有可编辑的文本,该文本只能通过按下按钮才能编辑。所以基本上,当按下“编辑”按钮时,应该使文本字段可编辑,焦点应该发送到文本字段。
以下是我尝试实现的方法:
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 来禁用它,结果相同。
是的,你需要将 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
就没用了