【问题标题】:SwiftUI - View using Enum not updatingSwiftUI - 使用枚举查看不更新
【发布时间】:2020-12-26 14:50:12
【问题描述】:

首先,我想说的是值更新,因为我在控制台中打印值,并且确定,点击每个选项都会按预期打印。但是,出于 UI 目的,我添加了一些视觉组件/样式来帮助指示当前选择。

我的枚举:

enum Gender : Int, CaseIterable {
    case men = 0
    case women = 1
  

    private var cases: [String]  {
        ["Men", "Women"]
    }
   
    func toString() -> String {
        cases[self.rawValue]
    }
}

这是有助于显示数据和索引数据的逻辑的视图

struct GenderTabMenuIndicator: View {
    var category: Gender
    var body: some View {
        HStack {
            ForEach(0..<Gender.allCases.count) { cat in
                GenderTabMenuIndicatorItem(category: Gender.allCases[cat], isActive: Gender.allCases[cat] == category)
                
            }
        }.frame(width: UIScreen.main.bounds.width * 0.75)
    }
}

这只是视图。但是,isActive 似乎并没有从初始选择/值切换。

struct GenderTabMenuIndicatorItem: View {
    @State var category: Gender
    @State var isActive: Bool
    var body: some View {
        VStack(spacing: 0) {
            Text(category.toString().uppercased())
                .onTapGesture {
                    print("tapped")
                    print(category.toString())
                }
                .font(.system(size: 18, weight: isActive ? .bold : .light))
                .frame(maxWidth: .infinity)
                .layoutPriority(1)
            if isActive {
                Rectangle()
                    .frame(width: 50, height: 2, alignment: .center)

            }
        }.foregroundColor(Color(SYSTEM_FONT_COLOUR))
    }
}

这就是我在实际视图中声明/使用所有这些组件的方式:

@State private var selected_tab: Gender = .men

VStack {
GenderTabMenuIndicator(category: selected_tab)
}

我不知道它是否是 ForEach 循环,但它同时打印了通过的相应案例。我在可以更新视图的地方使用了@State,但没有成功。

任何帮助将不胜感激!

【问题讨论】:

    标签: swift enums swiftui


    【解决方案1】:
    • @State 用于private更改,内部有视图

    • 从子视图来回更新更改,您必须使用@Binding

    • 我们可以使用$ 访问/传递@State 的绑定,ex :- $yourStateVariable

    这里是固定答案,

    struct ContentView: View {
            @State private var selected_tab: Gender = .men
            
            var body: some View {
                VStack {
                    Text("Selected: \(selected_tab.toString())")
                    GenderTabMenuIndicator(category: $selected_tab)
                }
            }
        }
    
        enum Gender : Int, CaseIterable {
            case men = 0
            case women = 1
            
            
            private var cases: [String]  {
                ["Men", "Women"]
            }
            
            func toString() -> String {
                cases[self.rawValue]
            }
        }
        
        struct GenderTabMenuIndicator: View {
            @Binding var category: Gender
            var body: some View {
                HStack {
                    ForEach(0..<Gender.allCases.count) { cat in
                        GenderTabMenuIndicatorItem(category: Gender.allCases[cat], selection: $category)
                        
                    }
                }.frame(width: UIScreen.main.bounds.width * 0.75)
            }
        }
        
        struct GenderTabMenuIndicatorItem: View {
            var category: Gender
            @Binding var selection: Gender
            var body: some View {
                VStack(spacing: 0) {
                    Text(category.toString().uppercased())
                        .onTapGesture {
                            selection = category
                        }
                        .font(.system(size: 18, weight: selection == category ? .bold : .light))
                        .frame(maxWidth: .infinity)
                        .layoutPriority(1)
                    if selection == category {
                        Rectangle()
                            .frame(width: 50, height: 2, alignment: .center)
                        
                    }
                }
            }
        }
    

    【讨论】:

    • 非常感谢!所以这仅仅是我使用 Bool 并在 ForEach 中设置值而不是在它自身的视图中设置的事实?
    • 对不起,我没有得到你,不知何故我添加了原因以及固定的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多