ios - UISearchController Filter Swift -
i have uitableviewcell 3 subviews filter when search, seen here:
1.the image view 2.the name label (black text) 3.the street name label (blue text)
this i've done far, i've managed understand how filter 1 array name:
maintableview.swift
var filterednames = [string] func updatesearchresultsforsearchcontroller(searchcontroller:uisearchcontroller) { // filter names self.filterednames = self.names.filter { (name:string) -> bool in if name.lowercasestring.containsstring(self.searchcontroller.searchbar.text!.lowercasestring){ return true } else { return false } } self.resultscontroller.tableview.reloaddata() } override func tableview(tableview: uitableview, heightforrowatindexpath indexpath: nsindexpath) -> cgfloat { return 100.5 } override func tableview(tableview: uitableview, numberofrowsinsection section: int) -> int { // search if tableview == self.tableview { self.streets.count return self.names.count } else { self.filteredstreets.count return self.filterednames.count } // return names.count } override func tableview(tableview: uitableview, cellforrowatindexpath indexpath: nsindexpath) -> uitableviewcell{ let cell = self.tableview.dequeuereusablecellwithidentifier("customcell", forindexpath: indexpath) as! customcell if tableview == self.tableview { cell.photo.image = self.images[indexpath.row] cell.name.text = names[indexpath.row] cell.streetname.text = streets[indexpath.row] } else { cell.photo.image = self.images[indexpath.row] cell.name.text = self.filterednames[indexpath.row] cell.streetname.text = self.streets[indexpath.row] } return cell } as of right now, when search, image view & street label not synchronized name. want filter 3 subviews synchronize correctly. how can achieve this?
i understand need use struct , filter 3 1 object i'v encountered difficulties managing appreciated thank !
edit:here code right now:
override func viewdidload() { super.viewdidload() var searchcontroller : uisearchcontroller! var resultscontroller = uitableviewcontroller() // // definespresentationcontext = true self.resultscontroller.tableview.datasource = self self.resultscontroller.tableview.delegate = self self.searchcontroller = uisearchcontroller(searchresultscontroller: self.resultscontroller) self.tableview.tableheaderview = self.searchcontroller.searchbar self.searchcontroller.searchresultsupdater = self self.searchcontroller.dimsbackgroundduringpresentation = true self.searchcontroller.searchbar.sizetofit() self.searchcontroller.searchbar.bartintcolor = uicolor.blackcolor() self.searchcontroller.searchbar.endediting(true) self.searchcontroller.searchbar.placeholder = "חפש ברים" allusers = createusers(names: names, streets: streets, images: images) filteredusers = allusers } var allusers: [user]! var filteredusers: [user]! func createusers(names names: [string], streets: [string], images: [uiimage?]) -> [user] { var users = [user]() guard names.count == streets.count && names.count == images.count else { return users } (index, name) in names.enumerate() { let user = user(name: name, streetname: streets[index], image: images[index]) users.append(user) } return users } //mark : search ! func updatesearchresultsforsearchcontroller(searchcontroller:uisearchcontroller) { if let searchtext = searchcontroller.searchbar.text?.lowercasestring { if searchtext.characters.count == 0 { filteredusers = allusers } else { filteredusers = allusers.filter { return $0.name.lowercasestring.containsstring(searchtext) || $0.streetname.lowercasestring.containsstring(searchtext) } } } self.resultscontroller.tableview.reloaddata() } override func tableview(tableview: uitableview, heightforrowatindexpath indexpath: nsindexpath) -> cgfloat { return 100.5; } override func didreceivememorywarning() { super.didreceivememorywarning() //////// //////// } override func tableview(tableview: uitableview, numberofrowsinsection section: int) -> int { return filteredusers.count } override func tableview(tableview: uitableview, cellforrowatindexpath indexpath: nsindexpath) -> uitableviewcell{ let cell = self.tableview.dequeuereusablecellwithidentifier("customcell", forindexpath: indexpath) as! customcell let user = filteredusers[indexpath.row] cell.photo.image = user.image cell.name.text = user.name cell.streetname.text = user.streetname return cell }
i recommend have 1 datasource instead of separate arrays names, street names , images. in following code filteredusers used datasource , allusers stored full array, used updating filteredusers every time new text entered in search bar.
create model:
struct user { var name: string var streetname: string var image: uiimage? } viewcontroller:
var allusers: [user]! var filteredusers: [user]! override func viewdidload() { super.viewdidload() //assuming have 3 arrays same amount of elements in each: allusers = createusers(names: names, streets: streets, images: images) filteredusers = allusers } func createusers(names names: [string], streets: [string], images: [uiimage?]) -> [user] { var users = [user]() guard names.count == streets.count && names.count == images.count else { return users } (index, name) in names.enumerate() { let user = user(name: name, streetname: streets[index], image: images[index]) users.append(user) } return users } func updatesearchresultsforsearchcontroller(searchcontroller:uisearchcontroller) { if let searchtext = searchcontroller.searchbar.text?.lowercasestring { if searchtext.characters.count == 0 { filteredusers = allusers } else { filteredusers = allusers.filter { return $0.name.lowercasestring.containsstring(searchtext) || $0.streetname.lowercasestring.containsstring(searchtext) } ?? [] } } self.resultscontroller.tableview.reloaddata() } override func tableview(tableview: uitableview, numberofrowsinsection section: int) -> int { return filteredusers ? filteredusers.count : 0 } override func tableview(tableview: uitableview, cellforrowatindexpath indexpath: nsindexpath) -> uitableviewcell{ let cell = self.tableview.dequeuereusablecellwithidentifier("customcell", forindexpath: indexpath) as! customcell let user = filteredusers[indexpath.row] cell.photo.image = user.image cell.name.text = user.name cell.streetname.text = user.streetname return cell } 
Comments
Post a Comment