如果没有您的具体代码,我无法确定,但我认为您正在描述 iPad 上显示的初始屏幕。这实际上是一个“第三视图”。您可以使用下面的代码查看它。
我正在回答您问题的“更好的方式”部分。这对我来说是一种“优雅地”处理它的方式。
struct VisibleSideBar2: View {
var body: some View {
NavigationView{
List(0..<10){ idx in
NavigationLink("SideBar \(idx)", destination: Text("Secondary \(idx)"))
}
Text("Welcome Screen")
}
}
}
如果您在“辅助视图”中有默认选择,则更加明显,因为现在您必须单击“返回”两次才能进入侧边栏
struct VisibleSideBar1: View {
@State var selection: Int? = 1
var body: some View {
NavigationView{
List(0..<10){ idx in
NavigationLink(
destination: Text("Secondary \(idx)"),
tag: idx,
selection: $selection,
label: {Text("SideBar \(idx)")})
}
Text("Third View")
}
}
}
为此,很多“解决方案”只是将NavigationView 变成Stack,但是您无法获得双列。
处理它的一种方法是VisibleSideBar2 中描述的内容。您可以制作/拥抱一个漂亮的“欢迎屏幕”,这样用户就不会受到空白屏幕的欢迎,然后自然的导航本能就会启动。您只能在 iPad Portrait 和 Catalyst/MacOS 上看到“欢迎屏幕”,其中 Stack 是不可用。
或者您可以通过在NavigationLink 中使用isActive 并将Sidebar 用作View 之类的菜单来绕过第三个屏幕
struct VisibleSidebar3: View{
@State var mainIsPresented = true
var body: some View {
NavigationView {
ScrollView{
NavigationLink(
destination: Text("Main View").navigationTitle("Main"),
isActive: $mainIsPresented,
label: {
Text("Main View")
})
NavigationLink("List View", destination: ListView())
}.navigationTitle("Sidebar")
//Not visible anymore
Text("Welcome Screen")
}
}
}
struct ListView: View{
var body: some View {
List(0..<10){ idx in
NavigationLink("SideBar \(idx)", destination: Text("Secondary \(idx)"))
}.navigationTitle("List")
}
}
就像我说的那样,我的回答并不是真正“解决”问题的方法。只是处理它。要修复它,我们将不得不以某种方式关闭“第三屏幕/欢迎屏幕”。然后操作剩余的UISplitViewController(关于此的几个 SO 问题)以显示 SideBar/Master 和 Detail View。
在UIKit 中似乎做了很多,如果你搜索SO,你会找到一种方法来创建一个行为类似于Settings 的UISplitViewController。