在Swift3中的JSON检索数据中搜索



i从Swift3中的Service URL检索数据,并在TableView中显示。我尝试搜索名称,显示过过滤的名称,但另一个单元格没有更新。请检查我的下面代码。

class MyViewController: UIViewController,UITableViewDataSource,UITableViewDelegate,UISearchBarDelegate {
    @IBOutlet weak var tableView: UITableView!
    @IBOutlet weak var searchBar: UISearchBar!
    var filteredArray = [String]()
    var shouldShowSearchResults = false
    var nameArray = [String]()
    var emailArray = [String]()
  var tableData = [String]()
    override func viewDidLoad() {
        super.viewDidLoad()
        downloadData()
   createSearchBar()
        // Do any additional setup after loading the view.
    }
    func createSearchBar(){
        searchBar.showsCancelButton = false
        searchBar.placeholder = "Enter your search"
        searchBar.delegate = self
        self.navigationItem.titleView = searchBar
    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        tableData = nameArray
        if shouldShowSearchResults
        {
            return filteredArray.count
        }
        else
        {
            return tableData.count
        }
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell:mycell! = tableView.dequeueReusableCell(withIdentifier: "cell") as! mycell
        if shouldShowSearchResults
        {
            cell.name.text = filteredArray[indexPath.row]
            cell.email.text = emailArray[indexPath.row]
            return cell
        }
        else
        {
            cell.name.text = tableData[indexPath.row]
            cell.email.text = emailArray[indexPath.row]
            return cell
        }
    }
    func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
        searchBar.endEditing(true)
    }
    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
        shouldShowSearchResults = true
        searchBar.endEditing(true)
        self.tableView.reloadData()
    }
    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        filteredArray = tableData.filter({
            (names:String) -> Bool in
            return names.lowercased().range(of: searchText.lowercased()) != nil
        })
        if searchText != ""
        {
            shouldShowSearchResults = true
            self.tableView.reloadData()
        }
        else
        {
            shouldShowSearchResults = false
            self.tableView.reloadData()
        }
    }
    func downloadData()
    {
        let url = URL(string: "http://www.json-generator.com/api/json/get/crdvbKvLoy?indent=2")!
        var request = URLRequest(url: url, cachePolicy: .reloadIgnoringCacheData, timeoutInterval: 10000)

        URLSession.shared.dataTask(with: request) { (data, response, error) in
            if error != nil {
                print(error!)
                return
            }
            do {
                if let jsonData = try JSONSerialization.jsonObject(with:data!, options: []) as? [[String:AnyObject]] {
                    print(jsonData)
                    //    Utility.SharedInstance.dict_UserDetails3 = jsonData as AnyObject
                    for item in jsonData {
                        if let name = item["Name"] as? AnyObject {
                            self.nameArray.append(name as! String)
                        }
                        if let email = item["Email"] as? AnyObject{
                            self.emailArray.append(email as! String)
                        }
                        DispatchQueue.main.async {
                            self.tableView.reloadData()
                        }
                    }
                }
            } catch let error as NSError {
                print(error)
            }
            }.resume()
    }
}

output:
search___________
Name      Email
----------------
Wasim     wasim@gmail.com
Dravid    dravid@gmail.com
Kohli     virat@gmail.com
Kallis    Jaques@gmail.com

I entered in search text as K
-----------------------------
search_____K______
Name      Email
----------------
Kohli     wasim@gmail.com
Kallis    dravid@gmail.com

在此搜索中有效,但是电子邮件字段不更新。请检查一次。我被尝试了更多样本,但没有解决。请检查一次,我为解决这个问题做了什么变化。

您过滤名称数组,而不是电子邮件地址数组。因此索引不匹配。

最好的解决方案是不要分开相关数据。正确构建它。

struct Person {
   var name: String
   var email: String
}
var people: [Person]?
var filteredResults: [Person]?

使用将姓名和电子邮件放在一起的人使用结构

最新更新