我已经使用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()
}
}
答案 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"]