SwiftUI的Tabbar会在选项卡视图中保留navigationBarTitle的位置

3
如何防止选项卡的滚动视图受其他选项卡的偏移影响?
我不想每次显示新选项卡时都将滚动视图强制置顶,只是希望新选项卡不受我查看的上一个选项卡的滚动位置的影响。
import SwiftUI

enum Tab {
    case First, Second, Third
    
    var title: String {
        switch self {
        case .First:
            return "First"
        case .Second:
            return "Second"
        case .Third:
            return "Third"
        }
    }
}

struct ContentView: View {
    @State var selectedTab = Tab.First
    var body: some View {
        NavigationView {
            TabView(selection: $selectedTab) {
                FirstView()
                    .tabItem {
                        Text("First")
                    }.tag(Tab.First)
                SecondView()
                    .tabItem {
                        Text("Second")
                    }.tag(Tab.Second)
                ThirdView()
                    .tabItem {
                        Text("Third")
                    }.tag(Tab.Third)
            }.navigationBarTitle(selectedTab.title, displayMode: .automatic)
            .navigationBarHidden(false)
        }
    }
}

struct FirstView: View {
    let data = [1,2,3,4,5,6,7,8,9,10]
    var body: some View {
        ScrollView(showsIndicators: true) {
            VStack {
                ForEach(data, id: \.self) { item in
                    Text("\(item)")
                        .frame(minWidth: 0, idealWidth: 100, maxWidth: .infinity, minHeight: 0, idealHeight: 100, maxHeight: .infinity, alignment: .center)
                }
            }
        }
    }
}

struct SecondView: View {
    let data = [1,2,3,4,5,6,7,8,9,10]
    var body: some View {
        ScrollView(showsIndicators: true) {
            VStack {
                ForEach(data, id: \.self) { item in
                    Text("\(item)")
                        .frame(minWidth: 0, idealWidth: 100, maxWidth: .infinity, minHeight: 0, idealHeight: 100, maxHeight: .infinity, alignment: .center)
                }
            }
        }
    }
}

struct ThirdView: View {
    let data = [1,2,3,4,5,6,7,8,9,10]
    var body: some View {
        ScrollView(showsIndicators: true) {
            VStack {
                ForEach(data, id: \.self) { item in
                    Text("\(item)")
                        .frame(minWidth: 0, idealWidth: 100, maxWidth: .infinity, minHeight: 0, idealHeight: 100, maxHeight: .infinity, alignment: .center)
                }
            }
        }
    }
}

那么您想恢复滚动的距离吗?我有点困惑,更多的描述会很有用。此外,“只是希望新标签页受到上次影响”对我来说也没有意义。 - George
抱歉,打错字了,“只想让新标签页不受上一个标签页的影响”。 - daihovey
我仍然不确定您是否希望每次打开新标签时从顶部开始,还是从上一个打开的标签的滚动位置开始。这句话似乎有点矛盾。 - George
好的,我想我明白了 - 导航栏会根据上次查看的选项卡来变化形式? - George
1个回答

2
这是因为您使用了一个 NavigationView,所以它保留了自己的状态。使每个选项卡的 NavigationView 独立。
在 Xcode 12 / iOS 14 上测试通过。

demo

struct ContentView: View {
    @State var selectedTab = Tab.First
    var body: some View {
        TabView(selection: $selectedTab) {
            NavigationView {
                FirstView()
                    .navigationBarTitle(Tab.First.title)
            }
            .tabItem {
                Text("First")
            }.tag(Tab.First)
            NavigationView {
                SecondView()
                    .navigationBarTitle(Tab.Second.title)
            }
            .tabItem {
                Text("Second")
            }.tag(Tab.Second)
            NavigationView {
                ThirdView()
                    .navigationBarTitle(Tab.Third.title)
            }
            .tabItem {
                Text("Third")
            }.tag(Tab.Third)
        }
    }
}

1
我将NavigationView包装在TabView中的原因是,当我从FirstView推出详细视图时,我想隐藏TabBar。上述解决方案无法隐藏选项卡栏。有什么办法可以同时解决滚动视图内容问题和在NavigationLink到详细视图时隐藏选项卡栏? - daihovey
1
原问题中没有提供任何信息...不过,以下是我的答案,希望能有所帮助 https://dev59.com/4FIG5IYBdhLWcg3w-nBU#61971653 - Asperi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接