如何在同一个“主”视图中切换 2 个不同的视图? SwiftUI

Posted

技术标签:

【中文标题】如何在同一个“主”视图中切换 2 个不同的视图? SwiftUI【英文标题】:How can I switch 2 different views inside same "Main" view? SwiftUI 【发布时间】:2021-02-25 16:07:32 【问题描述】:

我的 SwiftUI 视图有下一个问题:我有“用户视图”,在这个视图中我有 2 个按钮 - “已保存”和“我的成就”。当用户点击任何按钮时,它将显示不同的视图(例如:像 TabBar)。 它将在同一屏幕上切换,而不是切换到另一个视图。

Photo

如果需要,我可以创建另一个视图,并将其放入我的视图中。 希望你能理解我的快速英语。 谢谢你的帮助!

代码:

import SwiftUI

struct MainPage: View 

///State variable for default selected tag
@State var selectedView = 3

///Body-view for the main screen
var body: some View 
    
    TabView(selection: $selectedView) 
        //MARK: - First screen (1st view)
        VStack 
            Text("First View")
        ///1st Global VStack
        .tabItem 
            Label("First Item", systemImage: "1.circle")
        .tag(1)
        //MARK: - Scond screen (2nd view)
        VStack 
            Text("Second View")
        ///2nd Global VStack
        .tabItem 
            Label("Second Item", systemImage: "2.circle")
        
        .tag(2)
        //MARK: - Profile screen (3rd view)
        ZStack(alignment: .top) 
            Color.clear
            HStack(alignment: .center)
                VStack 
                    HStack() 
                        HStack() 
                            Button(action: , label: 
                                Image(systemName: "person")
                                    .resizable()
                                    .scaledToFit()
                                    .frame(width: 35 , height: 35)
                                    .foregroundColor(.gray)
                            )
                            .padding(.leading , -30)
                            .padding(.trailing, 20)
                            Text("User")
                                .bold()
                                .font(.custom("title", size: 24))
                                .lineLimit(1)
                        .padding(.trailing , 110)
                        .frame(width: 260)
                        Button(action: , label: 
                            Image(systemName: "gearshape")
                                .resizable()
                                .scaledToFit()
                                .frame(width: 35 , height: 35)
                                .foregroundColor(.gray)
                        )
                    
                    HStack(spacing: 30) 
                        Image(systemName: "")
                        Button(action: 
                        , label: 
                            Text("Saved")
                                .foregroundColor(.gray)
                                .font(.custom("title", size: 17))
                                .lineLimit(1)
                        )
                        Image(systemName: "")
                        Button(action: , label: 
                            Text("My achievement")
                                .foregroundColor(.gray)
                                .font(.custom("title", size: 17))
                                .lineLimit(1)
                        )
                    .frame(width: 300, height: 30, alignment: .center)
                    HStack(alignment: .center ,spacing: 10)
                        VStack(alignment: .leading , spacing: 20) 
                        .frame(width: 160, height: 2, alignment: .leading)
                        .background(Color.blue)
                        .padding(10)
                        VStack(alignment: .trailing)
                        .frame(width: 100, height: 2, alignment: .trailing)
                        .background(Color.red)
                        .padding()
                    .frame(width: 420, height: 2, alignment: .center)
                    .background(Color.gray)
                    .padding(10)
                
            ///Top HStack
            .frame(width: 300, height: 70, alignment: .center)
            .padding()
        ///3rd Global ZStack
        .tabItem 
            Label("Third item", systemImage: "3.circle")
        .tag(3)
        //MARK: - End
    

【问题讨论】:

错误是什么?你被困在哪里了? 所以你不想视图切换到位,但希望它们重叠或什么? 我不知道如何通过按钮在同一个父视图中包含两个不同的视图。那么,如何在同一个问题上切换这两个视图 【参考方案1】:

您可以使用这样的分段选择器来做到这一点。

    struct ExampleView: View

  @State private var selectedView = 0
  private let pickerOptions = ["Saved", "Achievements"]
  
  var body: some View 
    VStack 
      HStack 
        Text("ExampleView")
          .font(.title)
          .bold()
        
        Spacer()
       //: HStack
      .padding()
      
      Divider()
       
      Picker(selection: $selectedView, label: Text("")) 
        ForEach(0..<pickerOptions.count) 
          Text(self.pickerOptions[$0])
         //: ForEach
       //: Picker
      .pickerStyle(SegmentedPickerStyle())
      .padding()
      
      if selectedView == 0
      
        SavedView()
      
      else if selectedView == 1
      
        AchievementsView()
      
    
  

【讨论】:

谢谢!这是一个很棒的主意,而且很有效!但我需要其他设计。选择器设计很难定制 如果我们能更好地了解您希望它的外观,也许会有所帮助。你能描述得更详细些吗?

以上是关于如何在同一个“主”视图中切换 2 个不同的视图? SwiftUI的主要内容,如果未能解决你的问题,请参考以下文章

Knockout 将 2 个链接绑定到不同的视图并切换模型视图

iOS:如何在情节提要中在横向和纵向视图之间切换?

如何在我的 Xcode Swift 项目的不同导航堆栈中从一个视图控制器屏幕切换到另一个?

在不同导航控制器中的视图之间切换

在 MVVM wpf 中切换视图

显示来自 Xib 的自定义视图