代码之家  ›  专栏  ›  技术社区  ›  Oliver

关于搜索栏和Tableview的混淆

  •  -1
  • Oliver  · 技术社区  · 8 年前

    我的代码:

    import UIKit
    
    struct Human {
        var name = String()
        var surname = String()
    
    }
    
    class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate {
    
        @IBOutlet weak var tableView: UITableView!
    
        @IBOutlet weak var searchBar: UISearchBar!
    
        var members = [Human]()
    
        var filteredData = [String]()
    
        var inSearchMode = false
    
        var names = ["Oliver","Harold","John","Thea","Felicity"]
        var surnames = ["Queen","Finch","Reese","Queen","Smoak"]
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
    
    
            for i in 0..<names.count {
                members.append(Human(name: names[i],surname: surnames[i]))
            }
    
    
    
            tableView.delegate = self
    
            tableView.dataSource = self
    
            searchBar.delegate = self
    
            searchBar.returnKeyType = UIReturnKeyType.done
        }
    
        // MARK: - UITableViewDataSource
    
        func numberOfSections(in tableView: UITableView) -> Int {
    
            return 1
        }
    
        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    
            if inSearchMode {
    
                return filteredData.count
            }
    
            return members.count
        }
    
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
            if let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as? DataCell {
    
                let text: String!
    
                if inSearchMode {
    
                    text = filteredData[indexPath.row]
    
                } else {
    
                    text = members[indexPath.row].name
                }
    
                cell.congigureCell(text: text)
    
                return cell
    
            } else {
    
                return UITableViewCell()
            }
        }
    
        func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    
            if searchBar.text == nil || searchBar.text == "" {
    
                inSearchMode = false
    
                view.endEditing(true)
    
                tableView.reloadData()
    
            } else {
    
                inSearchMode = true
    
                filteredData = names.filter { $0.lowercased().contains(searchBar.text!.lowercased()) }
    
                tableView.reloadData()
    
            }
        }
        func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            showAlert(title: "Surname is...", msg: members[indexPath.row].surname)
        }
    
    }
    
    extension UIViewController {
    
        func showAlert(title: String, msg: String) {
            let alert = UIAlertController(title: title, message: msg, preferredStyle: .alert)
            let action = UIAlertAction(title: "OK", style: .default, handler: nil)
            alert.addAction(action)
            self.present(alert, animated: true, completion: nil)
        }
    }
    

    屏幕截图如下:

    https://imgur.com/a/aRMNe

    最后,我该如何解决这个问题?

    1 回复  |  直到 8 年前
        1
  •  0
  •   Vini App    8 年前

    使用方法如下:

    filteredData 键入到 Human

    var filteredData = [Human]()
    

    在中更改 cellForRow , didSelectRowAt textDidChange . 为更改的行添加了注释。

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
         if let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as? DataCell {
            let text: String!
            if inSearchMode {
                text = filteredData[indexPath.row].name // changed this line only
            } else {   
                text = members[indexPath.row].name
            }
            cell.textLabel?.text = text
            return cell   
        } else {
            return UITableViewCell()
        }
    }
    
    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        if searchBar.text == nil || searchBar.text == "" {
            inSearchMode = false
            view.endEditing(true)
            tableView.reloadData()
        } else {
            inSearchMode = true
            filteredData = members.filter { $0.name.lowercased().contains(searchBar.text!.lowercased()) } // changed this line
            tableView.reloadData()
        }
    }
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if inSearchMode {
            showAlert(title: "Surname is...", msg: filteredData[indexPath.row].surname) // added this line
        } else {
            showAlert(title: "Surname is...", msg: members[indexPath.row].surname)
        }
    }