SwiftUI - 使用枚举的视图不更新

4
首先,我想说的是值更新,当我在控制台中打印值时,每个选项都能按预期输出。但为了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的地方更新视图,但没有成功。任何帮助将不胜感激!
1个回答

3
  • @State 用于在视图内部进行私有更改

  • 要从子视图更新并传递更改,需要使用@Binding

  • 我们可以使用 $ 访问/传递@State的绑定值,例如 :- $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)
                    
                }
            }
        }
    }

非常感谢!所以问题就在于我使用了一个布尔值,并将其值设置在ForEach中,而不是在视图本身中对其进行设置? - SwiftUser
抱歉,我没听明白您的意思,不知何故我同时添加了原因和固定答案。 - YodagamaHeshan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接