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

iOS16中含searchable修饰符视图返回后主视图冻结问题

iOS16下searchable视图返回后主视图冻结的解决方案

问题现象

在iOS16环境中,当导航到带有.searchable修饰符的列表视图,激活搜索框弹出键盘后,选择列表项返回主视图,主视图会出现冻结状态,无法响应用户输入。该问题仅在iOS16存在,iOS15无此现象,且仅与searchable组件相关,其他文本输入组件未出现类似问题。

解决方案

问题根源是iOS16中系统未正确处理搜索键盘的回收流程,导致视图交互阻塞。可以通过先手动收起键盘,再关闭子视图的方式解决,提供两种实现方式:

方式一:强制收起所有键盘

修改CustomPicker中的按钮点击逻辑,在调用dismiss()前先触发键盘收起动作:

struct CustomPicker: View {
    @Environment(\.dismiss) private var dismiss
    @Binding var selection: String?
    let options: [String]
    var body: some View {
        List(options, id: \.self) { option in
            Button {
                selection = option
                // 强制收起所有活跃的键盘
                UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
                dismiss()
            } label: {
                Text(option)
            }
        }
        .searchable(text: .constant(""))
    }
}

方式二:通过FocusState管理搜索框焦点

使用@FocusState绑定搜索框的激活状态,在关闭视图前主动放弃焦点,触发键盘收起:

struct CustomPicker: View {
    @Environment(\.dismiss) private var dismiss
    @Binding var selection: String?
    let options: [String]
    // 管理搜索框的焦点状态
    @FocusState private var isSearchFocused: Bool
    
    var body: some View {
        List(options, id: \.self) { option in
            Button {
                selection = option
                // 放弃搜索框焦点,触发键盘收起
                isSearchFocused = false
                dismiss()
            } label: {
                Text(option)
            }
        }
        // 将搜索框的激活状态绑定到FocusState变量
        .searchable(text: .constant(""), isPresented: $isSearchFocused)
    }
}

说明

两种方案核心都是确保在关闭子视图前,搜索键盘已经完全收起,避免iOS16的系统bug导致主视图交互阻塞。此前尝试的NavigationLink(isActive:)方式未解决问题,是因为该方式未处理键盘回收的前置逻辑。

内容的提问来源于stack exchange,提问作者eghnacr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 11:05:32