2016-11-10 68 views
2

我有一个UITableViewCell与3子视图,我想过滤的时候我搜索,如下所示:UISearchController过滤斯威夫特

TableViewCell Example

1.图像视图 2.名称标签(黑色文本) 3.街道名称标签(蓝色文本)

这是我迄今所做的,我只设法了解如何筛选1个阵列的名称是:

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 
     } 

至于现在,当我搜索,图像视图&街道标签不与名称保持同步。我想过滤所有3个子视图以正确同步。我怎样才能做到这一点?

我明白我需要使用结构,并用一个物体过滤所有3,但心中已经遇到了一些困难,管理要做到这一点任何帮助将不胜感激谢谢!

编辑:这里是我的代码现在:

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 } 
      for (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 
     } 
+0

从[此时此刻]启动(https://www.youtube.com/watch?v=SgEO7nni5CQ&feature= youtu.be&t = 2318)看几分钟斯坦福大学课程。 ** H ** e使用'didSet' +'reloadData'。我认为这有助于解决您的问题 – Honey

回答

4

我会强烈建议有名称,街道名称和图像只有一个dataSource,而不是单独的阵列。在以下代码中filteredUsers始终用作数据源,而allUsers只是一个存储的完整数组,每次在搜索栏中输入新文本时用于更新filteredUsers

创建一个模型:

struct User { 
    var name: String 
    var streetName: String 
    var image: UIImage? 
} 

的ViewController:

var allUsers: [User]! 
var filteredUsers: [User]! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    //assuming you already have three arrays with the 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 } 
    for (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 
} 
+0

这是您的代码或其解决方案的例子吗? –

+0

如果我正确理解你的话,这是你的情况的解决方案。如果'streetName'或'name'包含输入的搜索字符串,则会过滤元素。通过使用单个模型,您可以发送您现在拥有的已失效标签。 – alexburtnik

+0

'类型'BarsViewController.User'的值没有成员'image''我得到这个错误 –