You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 11:35:30