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

如何将自定义按钮与SwiftUI的.searchable修饰符关联以唤起搜索栏?

解决SwiftUI点击按钮唤起系统默认搜索栏的问题

你遇到的问题核心是错误使用了属性包装器,且未将搜索栏的焦点状态与变量正确绑定。以下是可行的解决方案:

关键修正点

  1. 用@FocusState替代@FocusedState(后者是拼写错误,SwiftUI官方提供的正确属性包装器为@FocusState)
  2. 给.searchable修饰符添加.focused绑定,将搜索栏的焦点状态关联到你定义的变量
  3. 按钮点击时直接设置该变量为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 03:59:57