You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

SwiftUI中iOS 26底部栏搜索控件非激活状态不显示绑定搜索文本的问题咨询

SwiftUI中iOS 26底部栏搜索控件非激活状态不显示绑定搜索文本的问题咨询

大家好,我最近在做SwiftUI项目时遇到了一个iOS 26特有的搜索控件问题,想请教下社区的各位有没有解决方案或者思路。

我当前的需求是用.searchable(text:isPresented:...)实现一个基于网络的搜索流程(不是本地实时过滤),具体流程是这样的:

  • 用户点击iOS 26底部栏的系统搜索控件,搜索UI弹出(同时我会叠加一个自定义的“搜索界面”遮罩层)
  • 用户在系统搜索框中输入查询内容
  • 用户点击“搜索”按钮后,我关闭搜索UI并发起网络请求(同时处理加载、错误、结果展示的状态)
  • 核心期望:查询字符串能在主界面的底部搜索控件中保持可见,作为“当前搜索”的标识

但现在遇到的问题是:在搜索UI处于激活状态时,输入的查询文本能正常显示在系统搜索框里;但关闭搜索后,非激活状态的底部栏搜索控件只会显示提示占位符,完全不渲染已有的查询文本——可实际上绑定的searchText变量里是确实保留着查询内容的

我在视图里特意加了一个文本标签来展示searchText的值,它始终能正确显示最新的内容,这说明数据绑定是正常的,问题就出在底部栏搜索控件的非激活状态渲染上。

以下是能复现问题的简化代码:

struct SearchTextVisibilityExample: View {

    @State private var searchText = ""
    @State private var showSearchMode = false

    var body: some View {
        NavigationStack {
            ZStack {
                VStack(spacing: 24) {
                    Text("Search Text in ViewModel:")
                        .font(.headline)
                    
                    // 这个文本始终能正确显示searchText的值
                    Text(searchText.isEmpty ? "(empty)" : searchText)
                        .foregroundStyle(.blue)
                    
                    Spacer()
                }
                .padding()
                
                if showSearchMode {
                    // 自定义的搜索界面遮罩层
                    VStack(alignment: .leading, spacing: 16) {
                        Text("Type in the system search field below. On iOS 26, the text is visible here while searching,")
                        Text("but may not be rendered in the inactive bottom-bar search UI after dismiss.")
                            .foregroundStyle(.secondary)
                        
                        Spacer()
                    }
                    .padding()
                    .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading)
                    .background(.background)
                    .zIndex(1)
                }
            }
            .animation(nil, value: showSearchMode)
            .navigationTitle("Activity")
            .navigationBarTitleDisplayMode(.inline)
            .searchable(
                text: $searchText,
                isPresented: $showSearchMode,
                prompt: "Search transactions"
            )
            .onSubmit(of: .search) {
                showSearchMode = false
            }
            .toolbar {
                if #available(iOS 26, *) {
                    DefaultToolbarItem(kind: .search, placement: .bottomBar)
                }
            }
        }
    }
}

有没有朋友遇到过类似的问题?或者知道怎么让底部栏的搜索控件在非激活状态下也能正确显示绑定的搜索文本呢?麻烦指点一下,谢谢大家!

火山引擎 最新活动