简体   繁体   English

SwiftUI - 无法在列表中搜索和切换

[英]SwiftUI - Not able to search and toggle in a list

I have a list of cars with a toggle button next to each car.我有一个汽车列表,每辆汽车旁边都有一个切换按钮。 There is also a SearchBar at top.顶部还有一个 SearchBar。 Currently, toogle works fine when search bar is empty.目前,当搜索栏为空时,toogle 工作正常。 When I type something in search bar, it neither filters the list nor toggle maintains its position. How can I maintain toggle position for each car when list is filtered?当我在搜索栏中输入内容时,它既不过滤列表也不切换保持其 position。如何在过滤列表时为每辆车保持切换 position?

For instance, if I select top three cars without search text.例如,如果我 select 没有搜索文本的前三辆车。 Now I start typing in the search bar, top three toggles remain enabled.现在我开始在搜索栏中输入内容,前三个切换按钮保持启用状态。

在此处输入图像描述

struct Car: Identifiable {
    var id = UUID()
    var name: String
    var selected: Bool = false
}
struct ContentView: View {
    @State var cars = [Car(name: "Subaru WRX", selected: false), Car(name:"Tesla Model 3",selected: false), Car(name:"Porsche 911 sjfnewif ewihf dwehifiw eufhwueif uhewfuwe u",selected: false), Car(name:"Renault Zoe",selected: false), Car(name:"DeLorean",selected: false), Car(name:"Mitsubishi Lancer",selected: false), Car(name:"Audi RS6", selected:false),Car(name:"Subaru WRX",selected: false), Car(name:"Tesla Model 3",selected: false), Car(name:"Porsche 911",selected: false), Car(name:"Renault Zoe",selected: false), Car(name:"DeLorean",selected: false), Car(name:"Mitsubishi Lancer",selected: false), Car(name:"Audi RS6", selected:false),
                Car(name:"Subaru WRX",selected: false), Car(name:"Tesla Model 3",selected: false), Car(name:"Porsche 911",selected: false), Car(name:"Renault Zoe",selected: false), Car(name:"DeLorean",selected: false), Car(name:"Mitsubishi Lancer",selected: false), Car(name:"Audi RS6",selected:false),
        Car(name:"Subaru WRX",selected: false), Car(name:"Tesla Model 3",selected: false), Car(name:"Porsche 911",selected: false), Car(name:"Renault Zoe",selected: false), Car(name:"DeLorean",selected: false), Car(name:"Mitsubishi Lancer",selected: false), Car(name:"Audi RS6", selected:false),
        Car(name:"Subaru WRX",selected: false), Car(name:"Tesla Model 3",selected: false), Car(name:"Porsche 911",selected: false), Car(name:"Renault Zoe",selected: false), Car(name:"DeLorean",selected: false), Car(name:"Mitsubishi Lancer",selected: false), Car(name:"Audi RS6", selected: false)]
    @State var showAlert = false
    @State private var searchText : String = ""
    var body: some View {
        NavigationView{
            VStack {
                ScrollView {
                    VStack (alignment: .leading) {
                        SearchBar(text: $searchText, placeholder: "Car name")
                        Button(action: {
                            self.showAlert = true
                            print("Button tapped!")
                        }) {
                            Text("Browse by category").foregroundColor(Color.black).padding(.leading).font(.system(size: 15))
                        }.alert(isPresented: $showAlert) {
                            Alert(title: Text("Your Score"), message: Text("\(self.searchText)"))
                        }
                        ForEach(self.cars.filter {
                            self.searchText.isEmpty ? true : $0.name.lowercased().contains(self.searchText.lowercased())
                        }.indices, id: \.self) { idx in
                            ZStack (alignment: .leading) {
                                RoundedRectangle(cornerRadius: 5, style: .continuous)
                                    .fill(Color.white).shadow(color:.green, radius: 5).padding(.leading).padding(.trailing)
                                HStack {
                                    VStack (alignment: .leading) {
                                        Text(self.cars[idx].name)
                                        CatalogAvailable()
                                    }.padding(.leading).padding(.trailing)
                                    Toggle(isOn: self.$cars[idx].selected) {
                                        Text("")
                                    }.toggleStyle(CheckboxToggleStyle()).labelsHidden()
                                        .frame(width: 10, height: 10, alignment: .trailing).padding()
                                }.padding().frame(maxWidth: .infinity, alignment: .leading)
                                
                            }.onTapGesture {
                                self.cars[idx].selected.toggle()
                            }
                        }
                    }
                }.navigationBarTitle("Add your cars")
                Button(action: {
                    print("Button tapped!")
                }) {
                    Text("Next")
                }.padding(.bottom)
            }
            
        }
    }
}

You iterate over indices but after filtering they do not correspond to original array, but just ordered indices of filtered array.您遍历indices但在过滤后它们不对应于原始数组,而只是过滤后数组的有序索引。 You have to work with id of cars instead你必须使用id of cars 来代替

Here is a sketch of idea:这是一个想法的草图:

ForEach(self.cars.filter {
    self.searchText.isEmpty ? true : $0.name.lowercased().contains(self.searchText.lowercased())
}) { car in
   self.row(for: car)
}

...

func row(for car: Car) -> some View {
  let idx = self.cars.firstIndex(of car)!

  return ZStack (alignment: .leading) {
        RoundedRectangle(cornerRadius: 5, style: .continuous)
            .fill(Color.white).shadow(color:.green, radius: 5).padding(.leading).padding(.trailing)
        HStack {
            VStack (alignment: .leading) {
                Text(self.cars[idx].name)
                CatalogAvailable()
            }.padding(.leading).padding(.trailing)
            Toggle(isOn: self.$cars[idx].selected) {
                Text("")
            }.toggleStyle(CheckboxToggleStyle()).labelsHidden()
                .frame(width: 10, height: 10, alignment: .trailing).padding()
        }.padding().frame(maxWidth: .infinity, alignment: .leading)
        
    }.onTapGesture {
        self.cars[idx].selected.toggle()
    }

}

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

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