繁体   English   中英

如何让枚举案例的兄弟姐妹构建自定义选择器?

How to get siblings of enum case to build custom picker?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在尝试构建一个接受任何枚举大小写作为其选择的 SwiftUI,然后它会自动将其兄弟姐妹作为选项呈现。 这是我开始的,但我很难克服 generics:

enum Option: String, CaseIterable, Identifiable, Equatable {
    case abc
    case def
    case ghi
    var id: Self { self }
}

struct CustomPicker<Sources>: View where Sources: RawRepresentable & CaseIterable & Identifiable, Sources.AllCases: RandomAccessCollection, Sources.RawValue == String {
    @Binding var selection: Sources.AllCases.Element

    var body: some View {
        ScrollView(.horizontal) {
            HStack(spacing: 8) {
                ForEach(Sources.allCases) { item in
                    Text(item.rawValue)
                }
            }
            .padding(.horizontal)
        }
    }
}

当我尝试使用它时,我得到一个编译错误: Generic parameter 'Sources' could not be inferred

enum Fruit: String, CaseIterable, Identifiable, Equatable {
    case apple, banana, orange
}

struct ContentView: View {
    @State private var selectedFruit: Fruit = .apple // Error here

    var body: some View {
        CustomPicker(selection: $selectedFruit) // Error here
    }
}

如何正确获取 generics 以便能够处理任何 String/RawRepresentable 枚举并自动构建其兄弟姐妹?

1 个回复

您的代码离实现您期望的结果不远了。 一些评论:

  • 您不需要要求Sources符合Identifiable :它需要是Hashable才能与ForEach一起使用,然后强制ForEach使用\.self作为 id。 枚举的原始值是String类型(您需要它),使用\.self将始终有效。
  • Fruit是不可Identifiable的,也不需要是。
  • 主视图正在传递Fruit但picker-view 需要一个类型Sources.AllCases.Element :它们不匹配。 只需在@Binding中使用Sources即可。
  • 请记住更新@Binding的值。

下面是一个工作示例:

struct ContentView: View {
    @State private var selectedFruit: Fruit = .apple
    
    @State private var selectedCar = Car.ferrari

    var body: some View {
        VStack {
            CustomPicker(selection: $selectedFruit)
            
            CustomPicker(selection: $selectedCar)
            
            // Just for testing
            Text("Eating one \(selectedFruit.rawValue) in a \(selectedCar.rawValue)")
                .font(.largeTitle)
                .padding()
        }
    }
}

// The Enum doesn't need to be Identifiable
enum Fruit: String, CaseIterable {
    case apple, banana, orange
}

enum Car: String, CaseIterable {
    case ferrari, porsche, jaguar, dacia
}

// Replace Identifiable with Hashable
struct CustomPicker<Sources>: View where Sources: RawRepresentable & CaseIterable & Hashable, Sources.AllCases: RandomAccessCollection, Sources.RawValue == String {
    
    @Binding var selection: Sources    // This is the right type

    var body: some View {
        ScrollView(.horizontal) {
            HStack(spacing: 8) {
                
                // Force the id as the item itself
                ForEach(Sources.allCases, id: \.self) { item in
                    Text(item.rawValue)
                    
                        // Somehow you need to update the @Binding
                        .onTapGesture {
                            selection = item
                        }
                }
            }
            .padding(.horizontal)
        }
    }
}
2 加号选择器似乎针对所有兄弟姐妹,而不仅仅是它的直接兄弟姐妹

简化版本:我试图定位两个跨度中的第二个,只要它们紧邻。 据我了解,一个简单的跨度+跨度应该可以完成这项工作。 但是,给定以下 HTML: 还有这个 css: 该段落中有 5 个跨度。 4 个跨度以橙色背景呈现,但我对使用“加号”选择器的解释告诉我,这些跨度中只有 2 个应该是橙色的(跨度 2 和 ...

3 toggleClass - 父兄弟姐妹选择器 - 问题

只是有几个问题,下面是我制作的脚本。 它在切换表单面板方面工作得很好,但是当我开始与“活动”面板交互时(即单击输入字段),活动类从其父元素中删除,从而最小化面板。 有没有办法可以将切换功能限制为仅标题内容? https://jsfiddle.net/os883y47/ 我认为这是由于 & ...

4 HTML上的Jquery选择器。 第一和兄弟姐妹

我的任务是为一个HTML编写10个不同的选择器。 看来我被困在最后两个。 我不知道如何正确显示要突出的内容。 任何帮助将不胜感激。 这是执行查询的代码。 我正在尝试编写两个jquery选择器,它们执行以下两件事: 每个无序列表中的第一个链接。 (将选择链接1和链接4) ...

5 兄弟姐妹的CSS选择器[重复]

这个问题已经在这里有了答案: 是否有一个“先前的兄弟”选择器? 15个答案 对于我的网站,如果可以显示较大的图像(如放大图像),则该产品下方具有一个放大镜,可将容器高度增加30 30px 。 因此,现在,如果您的页面中有些图像没有较大的图像,则缩略图将看起来不均 ...

2016-06-17 16:56:43 1 44   html/ css
7 取决于兄弟姐妹的交替选择器

我有一些看起来像这样的html: 我想做的是创建一个CSS,为所有偶数行提供背景色。 我已经测试了nth-child(even)来尝试获得此结果,但是当我将CSS应用于.page时,第一组标题和行将确定第二组着色的顺序。 例如: CSS: 然后这就是我得到的结果: ...

2015-04-16 08:48:29 3 80   html/ css
8 将属性选择器与相邻兄弟姐妹一起使用

我试图与相邻的类一起使用属性选择器。 但是,它似乎无法协同工作。 还有其他方法可以使相邻的,非相同的同级应用CSS吗? 我也尝试过这个,没有运气: ...

2019-06-28 11:02:28 1 21   css
9 jQuery选择器,最接近的兄弟姐妹组合

我有以下html:- 我希望在单击span class hello时,此处的ul将添加一个类,并且尝试了以下操作: 在这种情况下,我该如何处理子母,父母和孩子并找到('ul')? ...

10 是否有ALL兄弟姐妹选择器? [重复]

可能重复: CSS全包兄弟选择器 CSS3有一个相邻的兄弟选择器+和一个通用的兄弟选择器〜 。 是否可以选择所有同级? (“常规”选择器实际上仅选择以下同级) 例如,在此示例中 ,我希望所有未悬停的a标签都变小,而不仅仅是紧随其后的标签。 HTML CSS ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM