UISearchController 过滤器 Swift

New*_*ons 2 search uitableview ios swift

我有一个UITableViewCell包含 3 个子视图的子视图,我想在搜索时对其进行过滤,如下所示:

TableViewCell 示例

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

这是我到目前为止所做的,我只设法了解如何过滤 1 个数组,即名称:

主表视图.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
        }
Run Code Online (Sandbox Code Playgroud)

截至目前,当我搜索时,图像视图和街道标签与名称不同步。我想过滤所有 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
        }
Run Code Online (Sandbox Code Playgroud)

ale*_*nik 5

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

创建模型:

struct User {
    var name: String
    var streetName: String
    var image: UIImage?
}
Run Code Online (Sandbox Code Playgroud)

视图控制器:

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
}
Run Code Online (Sandbox Code Playgroud)