我意识到我的 iOS 应用确实有双列导航视图样式。与单列导航相比,较大的 iPhone(如 iPhone 11 Pro Max)的拆分视图。
我试图根据 SwiftUI: unwanted split view on iPad 通过将 .navigationViewStyle(StackNavigationViewStyle())
修饰符应用于 NavigationView
来摆脱这种不需要的拆分视图。
然而,这引入了一个新问题,即 SwiftUI 在从详细视图返回后不会更新 NavigationLink
选择状态。返回后,该链接仍显示为活动状态。再次删除 .navigationViewStyle(StackNavigationViewStyle())
后,选择状态正确更新,所以我想我错过了一些东西。
我创建了一个最小的可重现示例项目。请看下面的代码。
此图演示了使用 NavigationLink
修饰符时从详细视图返回后未更新 .navigationViewStyle(StackNavigationViewStyle())
选择状态的问题。
最小可重现的示例项目:
import SwiftUI
@main
struct TestSwiftUIApp: App {
var body: some Scene {
WindowGroup {
View1()
}
}
}
struct View1: View {
var body: some View {
NavigationView {
List {
NavigationLink(
destination: View2(),
label: {
Text("View2")
}
).isDetailLink(false)
NavigationLink(
destination: View2(),
label: {
Text("View2")
}
).isDetailLink(false)
}.listStyle(InsetGroupedListStyle())
.navigationTitle("View1")
}
.navigationViewStyle(StackNavigationViewStyle())
}
}
struct View2: View {
@State var presentView3: Bool = false
var body: some View {
List {
Text("Foo")
NavigationLink("View3",
destination: View3(presentView3: $presentView3),
isActive: $presentView3
).isDetailLink(false)
Text("Bar")
}
.listStyle(InsetGroupedListStyle())
.navigationTitle("View 2")
}
}
struct View3: View {
@Binding var presentView3: Bool
@State
var isAddViewPresented: Bool = false
var body: some View {
List {
Button(action: {presentView3 = false}, label: {
Text("Dismiss")
})
}
.listStyle(InsetGroupedListStyle())
.navigationTitle("View3")
.toolbar {
ToolbarItem {
Button(action: {isAddViewPresented.toggle()}, label: {
Label("Add", systemImage: "plus.circle.fill")
})
}
}
.sheet(isPresented: $isAddViewPresented, content: {
Text("DestinationDummyView")
})
}
}