退出时返回两层的导航链接

Posted

技术标签:

【中文标题】退出时返回两层的导航链接【英文标题】:Navigation Link Returning Back Two Levels on Exit 【发布时间】:2021-04-10 01:42:56 【问题描述】:

我在从选项卡式视图中的导航视图返回时遇到问题。我的项目有一个设置选项卡,用户可以在其中通过导航链接“查看条目”进行选择。从那里另一个导航链接到“添加新条目”。从添加新条目返回应该会带您进入查看条目,但会返回另一个级别的设置菜单。

我在控制台上看到一条警告,指出“试图弹出到 /Library/Caches/com.apple... 的丢失目的地”。使用SwiftUI NavigationView trying to pop to missing destination (Monoceros?) 的选项卡式视图示例代码,我不再收到“pop-to-missing-destination”警告,但导航返回时我仍然遇到同样的问题。

下面的示例代码已准备好在 Xcode 12 中运行和测试。

在下面的示例代码中,点击设置并选择导航视图“查看条目”。这将是一个在列表中显示条目的屏幕。点击加号按钮可以添加新条目。 “添加新条目”屏幕上的文本字段不执行任何操作。单击“保存”或“返回”按钮应返回到“查看条目”屏幕,而是返回到设置菜单。 Save 按钮使用presentationMode.wrappedValue.dismiss 来关闭视图。

两个不同版本的选项卡视图逻辑对我的导航视图返回逻辑没有任何影响这一事实让我相信我的导航视图逻辑中只是有一些普通的旧错误,但我确定没有看不到一个。下面的示例代码使用标准的选项卡视图逻辑。

struct ContentView: View 
    
    @State private var selection = 0
    
    var body: some View 
        
        NavigationView 
            TabView (selection: $selection) 
                
                HomeView()
                    .tabItem 
                        Label("Home", systemImage: "house")
                    .tag(1)
                
                AView()
                    .tabItem 
                        Label("A", systemImage: "a.circle")
                    .tag(2)
                
                
                BView()
                    .tabItem 
                        Label("B", systemImage: "b.circle")
                    .tag(3)
                
                
                SettingsView()
                    .tabItem 
                        Label("Settings", systemImage: "gearshape")
                    .tag(4)
            
        
    



struct HomeView: View 
    
    var body: some View 
        
        Text("Home Screen")
    



struct AView: View 
    
    var body: some View 
        
        Text("A Screen")
    



struct BView: View 
    
    var body: some View 
        
        Text("B Screen")
    



struct SettingsView: View 
    
    var body: some View 
        
        VStack (alignment: .leading) 
            List 
            Text("Settings")
                .font(.title)
                .fontWeight(.bold)
                .padding(.leading, 15)
            
                NavigationLink(destination: SetAView()) Text("View Entries")
            
        
        .font(.body)
    



struct SetAView: View 
    
    var body: some View 
        
        List 
            Text("View Entries")
                .padding(.vertical, 10)
            Text("Normally entires would be displayed here")
            Text("Should return here upon adding new entry")
                .padding(.vertical, 10)
            Text("Click the + button to add new entry")
            
        
        .navigationBarItems(trailing: NavigationLink (destination: AddTestView()) 
            Image(systemName: "plus")
                .resizable()
                .foregroundColor(Color(.systemBlue))
                .frame(width: 18, height: 18)
         // body
        )
    



struct AddTestView: View 
    
    @Environment(\.presentationMode) var presentationMode
    @State private var catSelect: String = ""
    
    var body: some View 
        NavigationView 
            VStack 
                Form 
                    
                    Section 
                        TextField("Enter Entry Name", text: $catSelect)
                            .padding(.horizontal, 20)
                            .keyboardType(.default)
                    
                
            
            
            .navigationBarTitle(Text("Add new Entry"), displayMode: .inline)
            .navigationViewStyle(StackNavigationViewStyle())
            .navigationBarItems(trailing: Button(action: 
                self.presentationMode.wrappedValue.dismiss()
            ) 
                Text ("Save")
                
            )
        
    

【问题讨论】:

我将整个选项卡视图更改为导航视图,以查看选项卡视图是否导致导航链接出现问题。当我转到设置 -> 查看条目 -> +(添加新条目)然后单击后退按钮时,系统正确返回到查看条目。但是在添加新条目并单击保存时,系统会跳过查看条目屏幕并返回到设置菜单。 嗨,我已将NavigationView 放在TabView 之上,但是当深入到DetailsView 时,标签栏消失了。你知道如何解决它,所以标签栏总是显示? 当导航视图与标签视图一起使用时,标签栏通常会在导航到较低级别时消失。按下后退按钮时,标签栏会重新出现。 【参考方案1】:

经过大量分析后,我在实际代码中发现我有两个 NavigationView 副本——TabView 代码没有任何问题。删除不在 contentView 中的一个 NavigationView 然后导致几个功能无法工作,因此从头开始重建它们。现在所有的东西都可以使用 TabView 和 NaigationView 了,包括后退按钮。

【讨论】:

以上是关于退出时返回两层的导航链接的主要内容,如果未能解决你的问题,请参考以下文章

导航组件隐式深层链接后按退出应用

从深层链接启动时,我可以使用代码退出我的 android 应用程序吗?

Swift 导航链接问题

SwiftUI:在 iOS 14 上点击返回时导航链接崩溃,但在 iOS 13 上没有

JSF 中“返回”导航链接的最佳实践

深度链接导航到应用程序页面并返回 iOS 中的主页