我的UISearchBar结果有什么问题?

时间:2018-07-12 10:27:23

标签: swift xcode uitableview uisearchbar

我已经使用Alamofire和SwiftyJSON解析了JSON,以获取加密货币名称的列表并填充了表格视图。然后,我尝试使用UISearchBar过滤结果,但是无论我搜索什么,它总是显示名称数组的第一个结果,即使该过滤器在我使用print测试它并正确过滤时也可以正常工作。例如,我搜索以太坊,控制台将显示[“ name”:“ Ethereum”],但Tableview始终会显示“ Bitcoin”,如果我搜索不存在的名字,它什么也不会显示。任何人都可以识别出导致此问题的代码中的错误吗?非常感谢,对于任何一种编码我都是新手。

这是我的代码:

//
//  StartViewController.swift
//  CryptoClockTesting
//
//  Created by Peter Ruppert on 08/07/2018.
//  Copyright © 2018 Peter Ruppert. All rights reserved.
//

import UIKit
import Alamofire
import SwiftyJSON

class StartViewController: UIViewController, UISearchBarDelegate, 
UITableViewDelegate, UITableViewDataSource {

var names = [[String:String]]()

var isSearching = false

var filteredData = [[String:String]]()




@IBOutlet weak var tableView: UITableView!

@IBOutlet weak var searchBar: UISearchBar!

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
    let name = names[indexPath.row]
    let text: [String:String]

    if isSearching {
        text = filteredData[indexPath.row]
        print(text)


    } else {
        text = name
    }

    cell.textLabel?.text = name["name"]
    cell.textLabel?.textColor = UIColor.blue


    return cell
}

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {



    if searchBar.text == nil || searchBar.text == "" {



        isSearching = false

        view.endEditing(true)

        tableView.reloadData()
    } else {
        isSearching = true


        filteredData = names.filter({
            $0["name"] == searchBar.text
        })

        tableView.reloadData()
    }
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if isSearching {
        return filteredData.count
    } else {
    return names.count
}
}

func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
    tableView.isHidden = false

}
func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
    tableView.isHidden = true
}




override func viewDidLoad() {
    super.viewDidLoad()




    tableView.isHidden = true

    searchBar.delegate = self
    tableView.delegate = self
    tableView.dataSource = self
    searchBar.returnKeyType = UIReturnKeyType.done

    self.view.backgroundColor = .blue



    let urlString = "https://api.coingecko.com/api/v3/coins"

    if let url = URL(string: urlString) {
        if let data = try? String(contentsOf: url) {
            let json = JSON(parseJSON: data)


            parse(json: json)


        }

    }
}



//Parsing News API and adding to table, then use table view setup to properly display.
func parse(json: JSON) {
    for result in json[].arrayValue {
        let name = result["name"].stringValue
        let obj = ["name": name]

        names.append(obj)

    }
    tableView.reloadData()
}

}

1 个答案:

答案 0 :(得分:1)

这是因为您始终在name["name"]中将其设置为cellForRowAt

if isSearching {
    text = filteredData[indexPath.row]
    print(text)


} else {
    text = name
}

cell.textLabel?.text = name["name"] // should be text["name"]