添加Face ID登录后NavigationStack隐藏二级视图导航栏与工具栏问题
问题解决:登录后导航栏元素消失的问题
问题根源是嵌套的NavigationStack:登录页面已经使用了NavigationStack,而PersonalExpensesView内部又套了一层,导致内层视图的导航标题、工具栏按钮被外层导航上下文覆盖,仅保留了不受层级影响的searchable组件。
修复步骤:
1. 移除PersonalExpensesView内部的NavigationStack
直接删除PersonalExpensesView里的外层NavigationStack,让视图内容直接使用导航修饰符:
var body: some View { VStack { // 你的支出列表内容 } .navigationTitle("Personal Expenses") .toolbar { ToolbarItem(placement: .navigationBarLeading) { EditButton() } ToolbarItem(placement: .navigationBarTrailing) { Button { showingSheet = true } label: { Label("Add Book", systemImage: "plus") } } } .searchable(text: $textFilter) .sheet(isPresented: $showingSheet) { NewPEView() .environmentObject(PEviewModel) } }
2. 调整MainView的导航设置
MainView不需要自行添加NavigationStack,直接在TabView上添加返回按钮隐藏修饰符即可:
struct MainView: View { @StateObject var PEviewModel = PEViewModel() var body: some View { TabView { PersonalExpensesView() .environmentObject(PEviewModel) .tabItem { Label("Personal expenses list", systemImage: "dollarsign.circle") } // 补充完整另一视图代码示例 Text("Graph View") .tabItem { Label("Graph", systemImage: "chart.bar.fill") } } .navigationBarBackButtonHidden(true) // 隐藏登录页面的返回按钮 } }
3. 登录页面代码保持不变
登录页面的NavigationStack作为应用根导航,负责跳转到MainView即可:
var body: some View { NavigationStack { VStack { Button() { authenticate() } label: { Label("Usar Face ID", systemImage: "faceid") } .customButton() } .navigationDestination(isPresented: $unlocked){ // authenticate() 设置 unlocked 为 true MainView() } } }
原理说明:
SwiftUI的NavigationStack是上下文感知的,同一导航层级仅需一个根NavigationStack。嵌套的NavigationStack会导致内层视图的导航修饰符(navigationTitle、toolbar)失效,因为外层导航栈会优先处理导航栏内容;而searchable是视图级别的修饰符,不受嵌套影响,因此会被保留。
内容的提问来源于stack exchange,提问作者Mateo Etchepare
相关产品推荐
相关产品推荐

