SwiftUI:点击NavigationView.searchable的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
相关产品推荐
相关产品推荐

