SwiftUI:TabView 和 NavigationView 在 iPhone 上运行良好但在 iPad 上运行不佳?
SwiftUI: TabView and NavigationView play nicely on iPhone but not on iPad?
我的应用有一个显示选项列表和几个完全不同的页面的主屏幕。每个都指向一个调度程序视图,该视图带有一个指示要显示哪个页面的标签。我还希望能够在页面之间滑动。所以我有这段代码(当然,从实际应用程序大大简化,但以相同的方式运行):
struct Tab: Hashable {
let name: String
let id: Int
}
struct ContentView: View {
let tabs: [Tab] = [Tab(name: "first", id: 1), Tab(name: "second", id: 2), Tab(name: "third", id: 3)]
var body: some View {
NavigationView {
Form {
List (tabs, id: \.self) { tab in
NavigationLink(destination: Dispatcher(which: tab.id)) {
VStack (alignment: .leading) {
Text(tab.name).font(.headline).bold()
}
}
}
}.navigationTitle("test")
Text("hello")
}
}
}
struct Dispatcher: View {
var which: Int
@State private var tab = 2
var body: some View {
TabView(selection: $tab) {
Text("first page").tag(1)
Text("second page").tag(2)
Text("third page").tag(3)
}
.tabViewStyle(PageTabViewStyle(indexDisplayMode: .never))
.onAppear(perform: { tab = which })
}
}
在 iPhone 上,它工作正常。但是在 iPad 上,在任一方向上,点击主页中的任何选项都会将我带到同一子页面,该子页面由 @State 变量选项卡的初始值设置。正在执行.onAppear中的赋值,但忽略了tab的新值
非常感谢收到的任何想法。
杰里米
为什么不这样做:
struct Dispatcher: View {
@State var which: Int
var body: some View {
TabView(selection: $which) {
Text("first page").tag(1)
Text("second page").tag(2)
Text("third page").tag(3)
}
.tabViewStyle(PageTabViewStyle(indexDisplayMode: .never))
}
}
现在 workingdog 已经回答了我的问题,我可以扩展它吗?
我在 iPad 上实现了他(当然也有她)的解决方案。我单击 NavigationView 列表中的一个选项(例如,“第二个”)。单击的行突出显示并显示第二页。
然后我滑动以显示另一页(比如“第三页”)。没关系。
但是“second”在 NavigationView 列表中仍然突出显示,所以我不能点击它 return 到第二页。
我可以告诉 NavigationView 列表突出显示与实际显示页面对应的条目吗?还是什么都不突出?
我的应用有一个显示选项列表和几个完全不同的页面的主屏幕。每个都指向一个调度程序视图,该视图带有一个指示要显示哪个页面的标签。我还希望能够在页面之间滑动。所以我有这段代码(当然,从实际应用程序大大简化,但以相同的方式运行):
struct Tab: Hashable {
let name: String
let id: Int
}
struct ContentView: View {
let tabs: [Tab] = [Tab(name: "first", id: 1), Tab(name: "second", id: 2), Tab(name: "third", id: 3)]
var body: some View {
NavigationView {
Form {
List (tabs, id: \.self) { tab in
NavigationLink(destination: Dispatcher(which: tab.id)) {
VStack (alignment: .leading) {
Text(tab.name).font(.headline).bold()
}
}
}
}.navigationTitle("test")
Text("hello")
}
}
}
struct Dispatcher: View {
var which: Int
@State private var tab = 2
var body: some View {
TabView(selection: $tab) {
Text("first page").tag(1)
Text("second page").tag(2)
Text("third page").tag(3)
}
.tabViewStyle(PageTabViewStyle(indexDisplayMode: .never))
.onAppear(perform: { tab = which })
}
}
在 iPhone 上,它工作正常。但是在 iPad 上,在任一方向上,点击主页中的任何选项都会将我带到同一子页面,该子页面由 @State 变量选项卡的初始值设置。正在执行.onAppear中的赋值,但忽略了tab的新值
非常感谢收到的任何想法。
杰里米
为什么不这样做:
struct Dispatcher: View {
@State var which: Int
var body: some View {
TabView(selection: $which) {
Text("first page").tag(1)
Text("second page").tag(2)
Text("third page").tag(3)
}
.tabViewStyle(PageTabViewStyle(indexDisplayMode: .never))
}
}
现在 workingdog 已经回答了我的问题,我可以扩展它吗?
我在 iPad 上实现了他(当然也有她)的解决方案。我单击 NavigationView 列表中的一个选项(例如,“第二个”)。单击的行突出显示并显示第二页。
然后我滑动以显示另一页(比如“第三页”)。没关系。
但是“second”在 NavigationView 列表中仍然突出显示,所以我不能点击它 return 到第二页。
我可以告诉 NavigationView 列表突出显示与实际显示页面对应的条目吗?还是什么都不突出?