SwiftUI 中的 textFieldDidBeginEditing 和 textFieldDidEndEditing
textFieldDidBeginEditing and textFieldDidEndEditing in SwiftUI
如何将方法 textFieldDidBeginEditing
和 textFieldDidEndEditing
与 apple 的默认 TextField 结构一起使用。
TextField
有 onEditingChanged
和 onCommit
回调。
例如:
@State var text = ""
@State var text2 = "default"
var body: some View {
VStack {
TextField($text, placeholder: nil, onEditingChanged: { (changed) in
self.text2 = "Editing Changed"
}) {
self.text2 = "Editing Commited"
}
Text(text2)
}
}
onEditingChanged
中的代码仅在用户选择textField
时调用,而onCommit
仅在点击return、完成等时调用。
编辑:当用户从一个TextField
变为另一个时,之前选择的TextField
的onEditingChanged
被调用一次, changed
(参数)等于 false
,just-selected TextField
的 onEditingChanged
也被调用,但参数等于 true
. onCommit
回调是 而不是 为先前选择的 TextField
.
调用的
编辑 2:
添加一个示例,说明当用户点击 return 或更改 TextField
时调用函数 committed()
,以及当用户点击 TextField
时调用 changed()
:
@State var text = ""
var body: some View {
VStack {
TextField($text, placeholder: nil, onEditingChanged: { (changed) in
if changed {
self.changed()
} else {
self.committed()
}
}) {
self.committed()
}
}
}
斯威夫特用户界面 2
ios15 and above
swiftui2 的语法已更改
当 属性 值更改时触发修饰符 onChange
,当提交表单时触发 onSubmit
即您按 enter
TextField("search", text: $searchQuery)
.onChange(of: searchQuery){ newValue in
print("textChanged")
}
.onSubmit {
print("textSubmitted")
}
SwiftUI 3 (iOS 15+)
由于 TextField.init(_text:onEditingChanged:) 计划在未来的版本中弃用,因此最好使用 @FocusState。此方法还有一个额外的好处,即知道 TextField 何时不再是“第一响应者”,而单独使用 .onChange(of:)
和 .onSubmit(of:)
是做不到的。
@State private var text = ""
@FocusState private var isTextFieldFocused: Bool
var body: some View {
TextField("Text Field", text: $text)
.focused($isTextFieldFocused)
.onChange(of: isTextFieldFocused) { isFocused in
if isFocused {
// began editing...
} else {
// ended editing...
}
}
}
如何将方法 textFieldDidBeginEditing
和 textFieldDidEndEditing
与 apple 的默认 TextField 结构一起使用。
TextField
有 onEditingChanged
和 onCommit
回调。
例如:
@State var text = ""
@State var text2 = "default"
var body: some View {
VStack {
TextField($text, placeholder: nil, onEditingChanged: { (changed) in
self.text2 = "Editing Changed"
}) {
self.text2 = "Editing Commited"
}
Text(text2)
}
}
onEditingChanged
中的代码仅在用户选择textField
时调用,而onCommit
仅在点击return、完成等时调用。
编辑:当用户从一个TextField
变为另一个时,之前选择的TextField
的onEditingChanged
被调用一次, changed
(参数)等于 false
,just-selected TextField
的 onEditingChanged
也被调用,但参数等于 true
. onCommit
回调是 而不是 为先前选择的 TextField
.
编辑 2:
添加一个示例,说明当用户点击 return 或更改 TextField
时调用函数 committed()
,以及当用户点击 TextField
时调用 changed()
:
@State var text = ""
var body: some View {
VStack {
TextField($text, placeholder: nil, onEditingChanged: { (changed) in
if changed {
self.changed()
} else {
self.committed()
}
}) {
self.committed()
}
}
}
斯威夫特用户界面 2
ios15 and above
swiftui2 的语法已更改
当 属性 值更改时触发修饰符 onChange
,当提交表单时触发 onSubmit
即您按 enter
TextField("search", text: $searchQuery)
.onChange(of: searchQuery){ newValue in
print("textChanged")
}
.onSubmit {
print("textSubmitted")
}
SwiftUI 3 (iOS 15+)
由于 TextField.init(_text:onEditingChanged:) 计划在未来的版本中弃用,因此最好使用 @FocusState。此方法还有一个额外的好处,即知道 TextField 何时不再是“第一响应者”,而单独使用 .onChange(of:)
和 .onSubmit(of:)
是做不到的。
@State private var text = ""
@FocusState private var isTextFieldFocused: Bool
var body: some View {
TextField("Text Field", text: $text)
.focused($isTextFieldFocused)
.onChange(of: isTextFieldFocused) { isFocused in
if isFocused {
// began editing...
} else {
// ended editing...
}
}
}