SwiftUI Tabbar 在选项卡的 View 中保留 navigationBarTitle 位置

标签 swiftui

如何阻止标签页 ScrollView 的偏移量受到其他标签页偏移量的影响?

我不想在每次显示新标签时都强制 ScrollView 到顶部,而只是希望新标签不受我查看的最后一个标签的滚动位置的影响。

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)
                }
            }
        }
    }
}

最佳答案

因为你使用了一个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)
        }
    }
}

关于SwiftUI Tabbar 在选项卡的 View 中保留 navigationBarTitle 位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64102087/

相关文章:

ios - 如何为 didReceiveRemoteNotification 生成组合发布器?

swiftui - 如何在 SwiftUI 中的形状笔划上应用内部阴影?

swift - Catch' block 无法访问,但我包括了 try

ios - 后端交互如何在像 iOS Activity 应用程序这样有多天数据要显示给用户的应用程序中工作?

objective-c - SwiftUI:如何在 Objective-C 中获取窗口

swift - 当变量嵌套在对象中时,如何使用 SwiftUI 将绑定(bind)传递给 subview ?

ios - 从 SwiftUI 颜色选择器中获取值(value)

ios - 带 SwiftUI 的播放/停止按钮

ios - 如何使 VStack 可点击以在 SwiftUI 中显示警报

ios - TextEditor 在 SwiftUI 中被键盘遮挡