如何在 TabView SwiftUI 中保存视图的列表状态

Posted

技术标签:

【中文标题】如何在 TabView SwiftUI 中保存视图的列表状态【英文标题】:How to save List state for View in TabView SwiftUI 【发布时间】:2020-03-13 09:39:15 【问题描述】:

我在 SwiftUI 中有一个带有标签的 TabView。当我从一个 FirstView 滚动列表并点击另一个选项卡并切换回 FirstView 时,我在 FirstView 中的列表会自动重绘并滚动到顶部。如何解决这个问题。

enter link description here

这是第一视图

 var body: some View 
    NavigationView 
        List 
            ForEach(feed)  game in
                FeedCardItem(gameModel: game)
                    .frame(width: UIScreen.main.bounds.width - 30, height: 400)
            
        
        .navigationBarTitle(Text("Новое сегодня"))
    

这是 TabView 实现

    TabView (selection: $currentTab) 
        FeedView().tabItem 
            Image(systemName: currentTab == 0 ? "house.fill" : "house")
                .renderingMode(.original)
                .imageScale(.large)
        .tag(0)

        RecommendationsView().tabItem 
            Image(systemName: currentTab == 1 ? "gamecontroller.fill" : "gamecontroller")
                .renderingMode(.original)
                .imageScale(.large)
        .tag(1)

        SearchView().tabItem 
            Image(systemName: currentTab == 2 ? "flame.fill" : "flame")
                .renderingMode(.original)
                .imageScale(.large)
        .tag(2)

        NotificationsView().tabItem 
            Image(systemName: currentTab == 3 ? "bell.fill" : "bell")
                .renderingMode(.original)
                .imageScale(.large)
        .tag(3)

        ProfileView().tabItem 
            Image(systemName: currentTab == 4 ? "person.fill" : "person")
                .renderingMode(.original)
                .imageScale(.large)
        .tag(4)

    .edgesIgnoringSafeArea(.top)

【问题讨论】:

提供一些可以运行和调试的最小代码。这将有助于提供快速答案。 @FelixMarianayagam 添加了 应该可以。 【参考方案1】:

我认为通过 SwiftUI 是不可能的。另一种方法是在 UIKit 中创建 tabview 并在 SwiftUI 中使用它。

我创建了一个快速示例,说明如何实现这一目标以及它如何解决您的问题。如果您有任何其他问题,请告诉我。

我已将代码上传到 GitHub。 https://github.com/subhan5/TabTest

在上传的代码中,UITab 文件夹包含通过 UIKit 创建的 tabview。 在 ContentView 中,我和 UIViewControllerRepresentable 一样转换并使用它。

【讨论】:

这是一个错误吗? Apple 没有提供 Tabs 的正确操作? 是的,Apple 目前还没有为 SwiftUI 提供它。 但是如果我想在SwiftUI中创建非常漂亮的自定义标签栏,我不能在保持状态的同时使用它吗? 目前,SwiftUI 有这个限制。【参考方案2】:

这里描述的 UITableViewConfigurator 是可能的:Scroll SwiftUI List to new selection

当然……这使用 UIViewControllerRepresentable....

【讨论】:

【参考方案3】:

我也有同样的问题,找到了这个解决方案:https://kavsoft.dev/SwiftUI_2.0/Tab_Bar

基本上,您可以只隐藏一个选项卡的内容,而不是用另一个内容视图替换它。我认为这个解决方案有点棘手,但很有效。

【讨论】:

以上是关于如何在 TabView SwiftUI 中保存视图的列表状态的主要内容,如果未能解决你的问题,请参考以下文章

如何在 swiftui 中弹出到 TabView 应用程序中的特定视图。我也使用了 StackNavigation 但不在 swiftui 中工作

如何在 Symfony2 中保存视图中的数据

ios 13 SwiftUI向后导航时如何避免导航视图内的TabView应用崩溃

在 SwiftUI 中构建一个自定义的类 TabView 视图

SwiftUI TabView 不更新视图

SwiftUI 中子视图内容被 TabView 底部 tabItems 遮挡的解决