SwiftUI使用.searchable搜索栏时,触发.onSubmit后如何收起搜索栏?
解决方案
方案1:使用系统内置的dismissSearch环境动作(优先推荐)
这是SwiftUI官方针对搜索栏退出提供的原生能力,适配iOS 15+(和.searchable的最低支持版本一致),实现步骤如下:
- 在使用搜索栏的视图中声明环境变量:
@Environment(\.dismissSearch) private var dismissSearch
- 在
.onSubmit(of: .search)的回调中直接调用该方法即可同时退出搜索激活状态、收起搜索栏:
.onSubmit(of: .search) { // 你原本的搜索业务逻辑 executeSearch() // 执行退出搜索状态 dismissSearch() }
方案2:通过isPresented绑定手动控制搜索栏显隐
如果需要自定义搜索栏的激活状态控制逻辑,可以使用带isPresented参数的.searchable重载方法:
- 声明状态变量控制搜索激活状态:
@State private var searchText = "" @State private var isSearchActive = false
- 给
.searchable修饰符绑定该状态:
.searchable(text: $searchText, isPresented: $isSearchActive, prompt: "搜索内容")
- 在
.onSubmit回调中将isSearchActive置为false即可退出搜索激活状态:
.onSubmit(of: .search) { executeSearch() isSearchActive = false }
注意事项
- 两种方案均不需要额外搭配UIKit的
resignFirstResponder相关逻辑,系统会自动处理键盘收起和搜索栏状态切换 - 如果同时使用了
@FocusState绑定搜索框焦点,注意不要和上述两种方案的状态冲突,避免出现状态不同步的问题
内容的提问来源于stack exchange,提问作者nickreps
相关产品推荐
相关产品推荐

