不再符合条件时,父视图中的条件导航链接会强制从子视图导航回父视图

时间:2020-01-25 18:58:36

标签: ios navigation swiftui

production:
  <<: *default
  database: spaz_production
  username: spaz
  password: <%= ENV['SPAZ_DATABASE_PASSWORD'] %>

在上面的代码中,我们有一个父视图和一个子视图。父视图包含条件标题和导航链接。子视图具有标题。导航到子视图时,导航工作正常。但是,一旦不再满足将导航链接保留在父视图中的条件(通过将设备从纵向旋转到横向),该连接将使子视图和父视图保持可导航中断,并迫使导航返回到父视图。这似乎是因为SwiftUI本身现在需要从父视图中重画组件。对于上面的示例,一种解决方案是仅使文本具有条件,并使导航链接同时保持在vstack和hstack中,如下所示:

import SwiftUI  

struct ConditionalNavigationParentView: View {  
    @Environment(\.verticalSizeClass) var verticalSizeClass: UserInterfaceSizeClass?  
    @Environment(\.horizontalSizeClass) var horizontalSizeClass: UserInterfaceSizeClass?  

    var body: some View {  

        NavigationView {  

            // iPhone Portrait  
            if horizontalSizeClass == .compact && verticalSizeClass == .regular {  

                VStack {  

                    Text("This is the Parent View.")  
                        .foregroundColor(Color.black)  
                        .font(.headline)  

                    NavigationLink(destination: ConditionalNavigationChildView()) {  

                        Text("Navigate to Child View.")  
                            .font(.body)  
                    }  
                }  
            }  

            // iPhone Landscape  
            if verticalSizeClass == .compact {  

                HStack {  

                    Text("This is the Parent View.")  
                        .foregroundColor(Color.black)  
                        .font(.headline)  

                    NavigationLink(destination: ConditionalNavigationChildView()) {  

                        Text("Navigate to Child View.")  
                            .font(.body)  
                    }  
                }  
            }  
        }  
    }  
}  

struct ConditionalNavigationChildView: View {  

    var body: some View {  

        Text("This is the Child View.")  
            .font(.headline)  
    }  
}  

虽然在这种情况下确实可以解决导航问题,但其他情况下似乎却没有多个导航链接。例如,假设您用另一个导航链接替换标题。第二个仍然可以正常工作,因为它不是有条件的,但是第一个及其所有子视图在旋转时将被推回到父视图。

在UIKit中,这永远不会成为问题,因为条件导航不会像这样推回到父视图。这是SwiftUI的错误吗?还是预期的行为?如果是预期的行为,那么具有多个条件导航链接的视图有什么解决方案?

0 个答案:

没有答案