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的错误吗?还是预期的行为?如果是预期的行为,那么具有多个条件导航链接的视图有什么解决方案?