如何将自定义按钮与SwiftUI的.searchable修饰符关联以唤起搜索栏?
解决SwiftUI点击按钮唤起系统默认搜索栏的问题
你遇到的问题核心是错误使用了属性包装器,且未将搜索栏的焦点状态与变量正确绑定。以下是可行的解决方案:
关键修正点
- 用
@FocusState替代@FocusedState(后者是拼写错误,SwiftUI官方提供的正确属性包装器为@FocusState) - 给
.searchable修饰符添加.focused绑定,将搜索栏的焦点状态关联到你定义的变量 - 按钮点击时直接设置该变量为
true,即可唤起系统默认搜索栏
完整代码示例
struct CountryListView: View { @State private var searchText = "" // 正确定义焦点状态变量 @FocusState private var isSearchFocused: Bool // 模拟你的SampleData let sampleCountries = ["中国", "美国", "日本", "德国", "法国"] var body: some View { NavigationStack { List(sampleCountries.filter { searchText.isEmpty ? true : $0.localizedCaseInsensitiveContains(searchText) }, id: \.self) { country in Text(country) } .navigationTitle("国家列表") // 绑定搜索文本与焦点状态 .searchable(text: $searchText) .focused($isSearchFocused) } // 右下角的自定义按钮(替换成你的MyButton即可) .toolbar { ToolbarItem(placement: .bottomBarTrailing) { Button(action: { // 点击唤起搜索栏 isSearchFocused = true }) { Image(systemName: "magnifyingglass") .font(.title) } } } } }
注意事项
- 该方案仅适用于iOS 16+,因为
NavigationStack和@FocusState是iOS 16引入的API - 如果你的自定义
MyButton是独立View,确保在其action闭包中正确修改isSearchFocused的值即可 - 系统默认的
.searchable样式会自动适配不同设备和系统版本,无需额外自定义
内容的提问来源于stack exchange,提问作者fbablu
相关产品推荐
相关产品推荐

