【问题标题】:Display subview from an array in SwiftUI在 SwiftUI 中显示数组中的子视图
【发布时间】:2021-07-26 13:56:53
【问题描述】:

我正在尝试呈现一系列视图,每个视图都从用户那里收集一些信息。当用户输入所有必要的数据时,他们可以移动到下一个视图。到目前为止,我已经获得了这个(简化的)代码,但我无法显示子视图本身(参见 MasterView VStack{} 中的第一行)。

import SwiftUI

protocol DataEntry {
    var entryComplete : Bool { get }
}

struct FirstSubView : View, DataEntry {
    @State var entryComplete: Bool = false
    
    var body: some View {
        VStack{
            Text("Gender")
            Button("Male") {
                entryComplete = true
            }
            Button("Female") {
                entryComplete = true
            }
            
        }
    }
}


struct SecondSubView :   View, DataEntry {
    var entryComplete: Bool {
        return self.name != ""
    }
    
    @State private var name : String = ""
   
    var body: some View {
        Text("Age")
        TextField("Your name", text: $name)
    }
}

struct MasterView: View {
    @State private var currentViewIndex = 0
    let subview : [DataEntry] = [FirstSubView(), SecondSubView()]
    
    var body: some View {
        VStack{
            //subview[currentViewIndex]
            Text("Subview placeholder")
            Spacer()
            HStack {
                Button("Prev"){
                    if currentViewIndex > 0 {
                        currentViewIndex -= 1
                    }
                }.disabled(currentViewIndex == 0)
                Spacer()
                Button("Next"){
                    if (currentViewIndex < subview.count-1){
                        currentViewIndex += 1
                    }
                }.disabled(!subview[currentViewIndex].entryComplete)
            }
        }
    }
}

出于样式原因,我不想使用 NavigationView。你能指出我如何解决这个问题的正确方向吗?也许是不同的方法?

【问题讨论】:

    标签: view swiftui swift-protocols


    【解决方案1】:

    一种方法是使用Base View 和结合枚举的switch 语句。这是我过去用来分隔流的类似模式。

    enum SubViewState {
         case ViewOne, ViewTwo
    }
    

    枚举是一种轻松记住和跟踪可用视图的方法。

    struct BaseView: View {
         @EnvironmentObject var subViewState: SubViewState = .ViewOne
    
         var body: some View {
             switch subViewState {
                 case ViewOne:
                     ViewOne()
                 case ViewTwo: 
                     ViewTwo()
             }
         }
    } 
    

    基本视图是视图控件的Container。您可能会添加一个推荐的视图模型,并为您的@EnvironmentObject 设置状态值,否则您将获得空指针异常。在此示例中,我设置了它,但我不能 100% 确定该语法是否正确,因为我没有可用的 IDE。

    struct SomeOtherView: View {
         @EnvironmentObject var subViewState: SubViewState
         var body: some View {
    
             BaseView()
    
             Button("Switch View") {
                 subViewState = .ViewTwo
             }
         }
    }
    

    这只是一个使用它的例子。您可以从任何地方访问您的@EnvironmentObject,甚至可以在其他视图中访问,因为它在处理之前始终可用。您可以简单地为其设置一个新值,它将更新此处显示的BaseView()。您可以在代码中使用相同的原则,使用逻辑来确定要显示的视图并简单地设置它的值,它就会更新。

    【讨论】:

      猜你喜欢
      • 2020-10-03
      • 2022-01-02
      • 2023-03-06
      • 2020-03-23
      • 1970-01-01
      • 2020-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多