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 列表突出显示与实际显示页面对应的条目吗?还是什么都不突出?