SwiftUI 中的 textFieldDidBeginEditing 和 textFieldDidEndEditing

textFieldDidBeginEditing and textFieldDidEndEditing in SwiftUI

如何将方法 textFieldDidBeginEditingtextFieldDidEndEditing 与 apple 的默认 TextField 结构一起使用。

TextFieldonEditingChangedonCommit 回调。

例如:

@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变为另一个时,之前选择的TextFieldonEditingChanged被调用一次, changed(参数)等于 false,just-selected TextFieldonEditingChanged 也被调用,但参数等于 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...
                }
            }
    }