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

SwiftUI:点击NavigationView.searchable的Cancel按钮如何返回上视图?

解决NavigationView中点击搜索Cancel按钮返回上一级视图的问题

你可以通过结合@Environment(\.isSearching)的状态监听,加上SwiftUI的导航 dismiss 机制来实现需求,以下是针对不同iOS版本的具体实现方案:

方案1:iOS 16+ 推荐使用NavigationStack

利用@Environment(\.dismiss)直接触发当前视图的返回操作:

import SwiftUI

struct SearchContentView: View {
    @Environment(\.isSearching) private var isSearching
    @Environment(\.dismiss) private var dismiss
    @State private var searchText = ""
    
    var body: some View {
        NavigationStack {
            List(["苹果", "香蕉", "橙子"], id: \.self) { fruit in
                Text(fruit)
            }
            .searchable(text: $searchText)
            .onChange(of: isSearching) { oldState, newState in
                // 仅当搜索从激活状态变为取消状态时触发返回
                if oldState && !newState {
                    dismiss()
                }
            }
        }
    }
}

方案2:iOS 15及以下使用NavigationView

通过@Environment(\.presentationMode)来执行返回:

import SwiftUI

struct SearchContentView: View {
    @Environment(\.isSearching) private var isSearching
    @Environment(\.presentationMode) private var presentationMode
    @State private var searchText = ""
    
    var body: some View {
        NavigationView {
            List(["苹果", "香蕉", "橙子"], id: \.self) { fruit in
                Text(fruit)
            }
            .searchable(text: $searchText)
            .onChange(of: isSearching) { oldState, newState in
                if oldState && !newState {
                    presentationMode.wrappedValue.dismiss()
                }
            }
        }
    }
}

关键注意点

  • 必须判断oldState为true且newState为false,避免视图初始化时的状态变化误触发返回操作
  • 如果使用NavigationStack的路径绑定(比如@State var path: [String] = []),也可以通过path.removeLast()来实现返回,效果和dismiss()一致

内容的提问来源于stack exchange,提问作者Engin Çelik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 05:41:19