SwiftUI:如何用FocusState替代TextField已弃用的onEditingChanged?
用FocusState替代TextField已弃用的onEditingChanged
苹果官方已弃用TextField的init(_:text:onEditingChanged:onCommit:)初始化方法,你可以通过FocusState结合视图修饰符来替代原来onEditingChanged的功能,具体实现如下:
1. 定义焦点跟踪变量
在视图结构体中,用@FocusState属性包装器声明一个变量,用于跟踪TextField的焦点状态:
@FocusState private var isTextFieldFocused: Bool
2. 将焦点状态绑定到TextField
给目标TextField添加.focused(_:)修饰符,把刚才定义的焦点变量绑定上去:
TextField("placeholder", text: $text) .focused($isTextFieldFocused)
3. 监听焦点变化
使用.onChange(of:)修饰符监听焦点变量的状态变更,这里的逻辑完全对应原来onEditingChanged闭包中的代码:
.onChange(of: isTextFieldFocused) { isFocused in print("focus changed") }
完整示例代码
struct ContentView: View { @State private var text = "" @FocusState private var isTextFieldFocused: Bool var body: some View { TextField("placeholder", text: $text) .focused($isTextFieldFocused) .onChange(of: isTextFieldFocused) { _ in print("focus changed") } } }
如果需要跟踪多个输入框的焦点,可以把FocusState的类型改为枚举,实现更精细的焦点管理:
enum InputField: Hashable { case email case nickname } struct ContentView: View { @State private var email = "" @State private var nickname = "" @FocusState private var focusedField: InputField? var body: some View { VStack { TextField("邮箱", text: $email) .focused($focusedField, equals: .email) TextField("昵称", text: $nickname) .focused($focusedField, equals: .nickname) } .onChange(of: focusedField) { field in print("焦点切换到:\(field?.rawValue ?? "无")") } } }
内容的提问来源于stack exchange,提问作者Lupurus
相关产品推荐
相关产品推荐

