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
相关产品推荐
相关产品推荐

