使用AlamoFire获取数据以根据UISearchBar值填充UITableView

时间:2017-05-23 12:02:24

标签: json swift uitableview uisearchbar

与许多JSON请求不同,我打算根据搜索栏中输入的内容发送JSON请求(使用AlamoFire),而不是过滤长预定义的JSON,从而获取要解析的JSON(使用SwiftyJSON)填写UITableView

enter image description here

我想要做的是使用searchTerm(键入搜索栏)使用geonames API请求的查询字段中的searchTerm向Geonames发送AlamoFire请求。即

  

http://api.geonames.org/searchJSON?formatted=true&q=(searchTerm)&maxRows=3&username=demo

我基本上不能做的是在填写搜索栏后发送请求,然后用该数据填充表格。

下面是我当前的代码(在视图加载时填充表格,其中包含已解析的JSON数据以及" burpham"

的请求
import UIKit
import Alamofire
import SwiftyJSON

class SearchAddLocationViewController: UIViewController, UITableViewDataSource, UITableViewDelegate
{

@IBOutlet weak var tblJSON: UITableView!

@IBOutlet weak var searchbarValue: UISearchBar!

weak open var delegate: UISearchBarDelegate?

var arrRes = [[String:AnyObject]]() //Array of dictionary

override func viewDidLoad()
{
    super.viewDidLoad()
}

public func searchBarTextDidEndEditing(_ searchBar: UISearchBar) // called when text ends editing
{
    callAlamo(searchTerm: searchbarValue.text!)
}

func callAlamo(searchTerm: String)
{
    Alamofire.request("http://api.geonames.org/searchJSON?q=\(searchTerm)&maxRows=5&username=garethallenstringer").responseJSON { (responseData) -> Void in
        if((responseData.result.value) != nil) {
            let swiftyJsonVar = JSON(responseData.result.value!)

            if let resData = swiftyJsonVar["geonames"].arrayObject {
                self.arrRes = resData as! [[String:AnyObject]]
            }
            if self.arrRes.count > 0 {
                self.tblJSON.reloadData()
            }
        }
    }
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell : UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "addLocProtoCell")!
    var dict = arrRes[indexPath.row]
    cell.textLabel?.text = dict["name"] as? String
    cell.detailTextLabel?.text = dict["countryName"] as? String
    return cell
}

public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
    return arrRes.count
}

override func didReceiveMemoryWarning()
{
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

}

1 个答案:

答案 0 :(得分:1)

您需要倾听UISearchBar委托的func searchBarTextDidEndEditing(_ searchBar: UISearchBar)方法,以填充UITableView

class ViewController: UIViewController, UISearchBarDelegate {

    @IBOutlet private weak var searchBar: UISearchBar?

    override func viewDidLoad() {
        super.viewDidLoad()

        self.searchBar?.delegate = self
    }

    //MARK: UISearchBarDelegate methods
    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
       //You can do your request via Alamofire to populate tableView
    }
}

更新#1

import UIKit
import Alamofire
import SwiftyJSON

class SearchAddLocationViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UISearchBarDelegate
{

    @IBOutlet weak var tblJSON: UITableView!

    @IBOutlet weak var searchbarValue: UISearchBar!

    var arrRes = [[String:AnyObject]]() //Array of dictionary

    override func viewDidLoad()
    {
        super.viewDidLoad()
        self.searchbarValue.delegate = self
    }

    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) { // called when text ends editing
    {
        callAlamo(searchTerm: searchbarValue.text!)
    }

    func callAlamo(searchTerm: String)
    {
        Alamofire.request("http://api.geonames.org/searchJSON?q=\(searchTerm)&maxRows=5&username=garethallenstringer").responseJSON { (responseData) -> Void in
            if((responseData.result.value) != nil) {
                let swiftyJsonVar = JSON(responseData.result.value!)

                if let resData = swiftyJsonVar["geonames"].arrayObject {
                    self.arrRes = resData as! [[String:AnyObject]]
                }
                if self.arrRes.count > 0 {
                    self.tblJSON.reloadData()
                }
            }
        }
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell : UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "addLocProtoCell")!
        var dict = arrRes[indexPath.row]
        cell.textLabel?.text = dict["name"] as? String
        cell.detailTextLabel?.text = dict["countryName"] as? String
        return cell
    }

    public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    {
        return arrRes.count
    }

    override func didReceiveMemoryWarning()
    {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}