ios - UISearchController Filter Swift -


i have uitableviewcell 3 subviews filter when search, seen here:

tableviewcell example

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

Popular posts from this blog

sql server - Cannot query correctly (MSSQL - PHP - JSON) -

php - trouble displaying mysqli database results in correct order -

C++ Linked List -