SwiftUI的searchable修饰符未在导航栏标题下方默认显示搜索框
结论
这是iOS 15及更高版本的预期原生行为。
系统默认对导航栏附加的搜索栏采用自动隐藏策略:初始状态下搜索栏会收起到导航栏区域外,仅当用户向下滑动列表触发内容下拉时才会显示,以此默认给列表内容留出最大的展示空间。
实现默认显示搜索栏的方案
如果需要让搜索栏在页面加载时就默认展示,可以通过调整配置实现,可选方案如下:
- 方案1:给导航栏添加标题,同时指定标题展示模式为
inline,适配iOS 15及以上版本
修改后的代码示例:
@State private var searchText = "" let data = (1...50).map( {_ in Int.random(in: 1...10)} ) var body: some View { NavigationView { List { ForEach(data, id: \.self) { d in Text("\(d)") } } .navigationTitle("数据列表") .navigationBarTitleDisplayMode(.inline) } .searchable(text: $searchText) }
- 方案2:iOS 16+版本可以通过
searchable的isPresented绑定参数主动控制搜索栏的展示状态,同时推荐使用NavigationStack替代已经废弃的NavigationView
修改后的代码示例:
@State private var searchText = "" @State private var showSearch = true // 初始化值设为true即可默认展示搜索栏 let data = (1...50).map( {_ in Int.random(in: 1...10)} ) var body: some View { NavigationStack { List { ForEach(data, id: \.self) { d in Text("\(d)") } } .navigationTitle("数据列表") } .searchable(isPresented: $showSearch, text: $searchText) }
效果参考
- 初始状态(默认隐藏搜索栏):

- 下拉列表后显示搜索栏:

内容的提问来源于stack exchange,提问作者Petesta
相关产品推荐
相关产品推荐

