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

iOS 15下使用.searchable修饰符的搜索栏如何设置默认显示?

iOS 15 下 .searchable 搜索栏默认可见解决方案

针对iOS 15中系统.searchable修饰符默认隐藏搜索栏、设置placement: .navigationBarDrawer(.always)会强制转为inline标题的问题,以下是经过验证的可行方案:

方案1:滚动偏移触发法(无审核风险,推荐)

利用列表加载完成后的主动微小滚动操作,触发系统自动展示搜索栏,完全保留大标题样式,无需修改searchable配置。

import SwiftUI

struct SearchDemoView: View {
    @State private var searchText = ""
    // 列表首项唯一标识
    private let firstItemId = "first_list_item"
    
    var body: some View {
        NavigationView {
            ScrollViewReader { scrollProxy in
                List {
                    // 列表首个元素绑定id
                    Text("占位结果")
                        .id(firstItemId)
                    // 剩余列表内容
                    ForEach(1..<30) { index in
                        Text("结果\(index)")
                    }
                }
                .onAppear {
                    // 无动画滚动到首项顶部,触发搜索栏展示
                    withAnimation(.none) {
                        scrollProxy.scrollTo(firstItemId, anchor: .top)
                    }
                }
            }
            .navigationTitle("备忘录")
            .navigationBarTitleDisplayMode(.large)
            // 保持默认searchable配置,无需修改placement
            .searchable(text: $searchText)
        }
    }
}
  • 优点:完全使用公开API,无审核风险,代码侵入性极低,保留系统搜索栏所有原生功能(搜索建议、取消按钮、自动高亮等)
  • 缺点:仅适配iOS 15+,依赖ScrollViewReader的滚动逻辑

方案2:自定义搜索栏方案(全版本兼容,灵活度最高)

放弃系统.searchable修饰符,在导航栏的principal位置插入自定义搜索栏,完全不受系统滚动逻辑控制,实现和系统备忘录完全一致的始终可见效果。

import SwiftUI

// 自定义搜索栏组件,可按需扩展功能
struct CustomSearchBar: View {
    @Binding var searchText: String
    @FocusState private var isFocused: Bool
    
    var body: some View {
        HStack(spacing: 8) {
            Image(systemName: "magnifyingglass")
                .foregroundColor(.secondary)
            TextField("搜索", text: $searchText)
                .focused($isFocused)
            if !searchText.isEmpty {
                Button {
                    searchText = ""
                } label: {
                    Image(systemName: "xmark.circle.fill")
                        .foregroundColor(.secondary)
                }
            }
            if isFocused {
                Button("取消") {
                    searchText = ""
                    isFocused = false
                }
                .foregroundColor(.accentColor)
            }
        }
        .padding(.horizontal, 8)
        .padding(.vertical, 7)
        .background(Color(.systemGray6))
        .cornerRadius(10)
    }
}

// 页面调用代码
struct SearchDemoView: View {
    @State private var searchText = ""
    
    var body: some View {
        NavigationView {
            List {
                // 列表所有内容
                ForEach(0..<30) { index in
                    Text("结果\(index)")
                }
            }
            .navigationTitle("备忘录")
            .navigationBarTitleDisplayMode(.large)
            .toolbar {
                ToolbarItem(placement: .principal) {
                    CustomSearchBar(searchText: $searchText)
                }
            }
        }
    }
}
  • 优点:适配iOS 13+所有版本,搜索栏展示逻辑完全可控,可自定义样式、添加搜索历史、语音输入等扩展功能
  • 缺点:需要自行实现搜索栏的所有交互逻辑,没有系统自带的搜索建议、快捷输入等原生功能

方案3:iOS 16+ 原生API方案

如果应用最低支持版本可以升级到iOS 16,直接使用官方新增的displayMode配置即可,无需额外适配:

.searchable(text: $searchText, placement: .navigationBarDrawer(displayMode: .always))

该配置不会强制将大标题转为inline样式,完全符合系统备忘录的交互效果。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 07:06:03