我在 SwiftUI 中创建了一个自定义选项卡栏,但是当我选择一个选项卡时,它会完全重新加载视图。我该如何防止这种情况

Eth*_*all 4 xcode ios swift swiftui swiftui-tabview

  1. 我创建了一个自定义标签栏
  2. 我正在使用 switch 语句在我的视图之间切换
  3. 问题是每次我在选项卡之间切换时都会重新加载视图
  4. 当我在视图之间切换时如何“保存”视图的状态?

因此,例如,如果我在第一个选项卡的视图中,并且在滚动视图上向下滚动一点,然后转到第二个选项卡,然后返回第一个选项卡,它会完全重新加载视图,但不会显示我已向下滚动页面。

代码:

struct Home: View {

   @State var selectedIndex = 0
   @State var presented = false

   let icons = ["house", "hands.sparkles", "plus", "message", "person"]



   var body: some View {
    
    VStack{
        
        Spacer().fullScreenCover(isPresented: $presented, content: {
            Text("Create Post Here")
            Button(action: {
                presented.toggle()
            }, label: {
                Text("Close")
            })
        })
        
        switch selectedIndex{
            
        case 0:
            HomePage()
        case 1:
            NavigationView(){
                Discover()
            }
        case 2:
            LogoutForNow()
        case 3:
            LogoutForNow()
        case 4:
            NavigationView(){
                Profile2()
            }
            
        default:
            HomePage()
        }
        
        
        
        
        HStack{
            ForEach(0..<5, id: \.self){number in
                
                Spacer()
                Button(action: {
                    
                    if number == 2{
                        presented.toggle()
                    }else{
                        self.selectedIndex = number
                    }
                    
                }, label: {
                    if number == 2{
                        Image(systemName: icons[number])
                            .font(.system(size: 25, weight: .regular, design: .default))
                            .foregroundColor(.white)
                            .frame(width: 50, height: 50)
                            .background(Color.blue)
                            .cornerRadius(25)
                    }else{
                        Image(systemName: icons[number])
                            .font(.system(size: 25, weight: .regular, design: .default))
                            .foregroundColor(selectedIndex == number ? .black : Color(UIColor.lightGray))
                    }
                })
                Spacer()
            }
        }
    }
    
}
Run Code Online (Sandbox Code Playgroud)

}

Sto*_*oic 5

您可以通过几种方法来做到这一点。

方法 1:更改 Z 索引

您可以始终保持两个视图的绘制状态,但在非活动视图之上显示当前活动视图,而不是显示一个视图或另一个视图。您可以使用.zIndex()修饰符来做到这一点。

方法2:使用@SceneStorage(或@AppStorage)

和属性包装器@SceneStorage@AppStorage支持数据持久性。对于任何一种,您都应该跟踪要保留的值(例如滚动高度或其他值),并将其存储在 SceneStorage/AppStorage 中。

@AppStorage通常用于存储用户首选项或常量,并且是两个选项中最差的一个,但仍然是可能的。理想情况下,您应该@SceneStorage使用的是. 本质上,@SceneStorage允许您在“场景”中存储少量数据,例如用户滚动了多远。但是,当场景被破坏时,例如当用户关闭应用程序时,这些数据也会被破坏。你可以在这里找到更多

另外,如果您想知道如何存储用户在 a 中滚动的距离ScrollView,您应该使用 a ScrollViewReader:)