【问题标题】:Multiple filters for list in SwiftUISwiftUI 中列表的多个过滤器
【发布时间】:2022-01-06 09:41:54
【问题描述】:

如何过滤多个列表 切换?需要过滤红色、黄色和绿色切换,默认情况下(所有切换关闭)显示所有 Array 未过滤

struct Test: View {
    @State var redToggle: Bool = false
    @State var yellowToggle: Bool = false
    @State var greenToggle: Bool = false
    
    let testArray = ["red", "green", "yellow", "mint", "red", "green", "white"]
    
    var body: some View {
        
        VStack {
            List {
                    ForEach(testArray.filter({
                        return (
                             (!redToggle && $0.description != "red") ||
                             (!yellowToggle && $0.description == "red")
                             
                          //need add here some filters for green toggle 
                            
                        )
                    }), id: \.self) { colors in
                        Text("Color are \(colors)")
                    }
            }
            Spacer()
            HStack(alignment: .center) {
                Toggle(isOn: $redToggle) {
                    Text("Red")
                }.toggleStyle(.switch)
                
                Toggle(isOn: $yellowToggle) {
                    Text("Yellow")
                }.toggleStyle(.switch)
                
                Toggle(isOn: $greenToggle) {
                    Text("Green")
                }.toggleStyle(.switch)
            }
        }
        }
    }

【问题讨论】:

    标签: arrays swiftui swiftui-list


    【解决方案1】:

    如果您希望能够从列表中过滤多个内容,您可以尝试这样的操作

    import SwiftUI
    
    struct MultipleFilterView: View {
        let testArray = ["red", "green", "yellow", "mint", "red", "green", "white"]
        //Dictionary that contains your filter word and wether it is selected or now
        //If you want more options just add them here
        @State var keywordDict: [String: Bool] = ["red": false, "yellow": false, "green": false]
        //An array that contains all the selected keys
        var selectedKeys: [String]{
            keywordDict.keys.filter({ key in
                keywordDict[key] ?? false
            })
        }
        //identify if the user has selected items
        var hasSelectedItem: Bool{
            var results = false
            //returns false unless it finds a true in the dictionary
            //https://whatis.techtarget.com/definition/logic-gate-AND-OR-XOR-NOT-NAND-NOR-and-XNOR
            keywordDict.values.forEach({
                results = results || $0
            })
            return results
        }
        //List will show the selected items
        var filteredList: [String]{
            testArray.filter({ value in
                selectedKeys.contains(where: {
                    $0 == value
                })
            })
        }
        var body: some View {
            VStack {
                List {
                    //Show the filtered list if the user has selected an item
                    ForEach(hasSelectedItem ? filteredList: testArray, id: \.self) { colors in
                        Text("Color is \(colors)")
                    }
                }
                Spacer()
                HStack(alignment: .center) {
                    //Create a toggle for every key
                    //You need a custom Binding for a dictionary
                    ForEach(keywordDict.keys.sorted(by: <), id:\.self, content: { key in
                        Toggle(key, isOn: Binding(get: {
                            keywordDict[key] ?? false
                        }, set: {
                            keywordDict[key] = $0
                        })).toggleStyle(.switch)
                    })
                }
            }
        }
    }
    struct MultipleFilterView_Previews: PreviewProvider {
        static var previews: some View {
            //SingleFilterView()
            MultipleFilterView()
        }
    }
    

    【讨论】:

    • 是的,谢谢。但是在第一个变体中,当您选择两个或更多切换时,列表为空。因为第二个切换过滤现有列表,而不是默认使用两个参数(仅显示红色和黄色)
    • 修正后,工作正常。谢谢!
    • @AlexS 很高兴听到。你介意接受答案吗?这是您看到的绿色复选标记。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 2019-01-28
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多