API 到 table 视图,添加列并刷新

API to table view, Add columns and refresh

在此处附上代码。 这是API:“https://bittrex.com/api/v1.1/public/getmarketsummaries

我想在 "MarketName" 旁边的列中添加 "High" 和 "Low" 另外,我想每 10 秒刷新一次。

刷新部分,我遇到错误,sendUpdateRequest()

完整代码为:

import UIKit
var listData = [[String : AnyObject]]()

class DemoJsonTableViewController: UITableViewController {
    var listData = [[String : AnyObject]]()

    override func viewDidLoad() {
        super.viewDidLoad()

        var timer : Timer? = nil
        timer = Timer.scheduledTimer(timeInterval: 10, target: self,   selector: (#selector(self.sendUpdateRequest)), userInfo: nil, repeats: true)

        func sendUpdateRequest(){
            let url:String = "https://bittrex.com/api/v1.1/public/getmarketsummaries"

            let urlRequest = URL(string: url)

            URLSession.shared.dataTask(with: urlRequest!) { (data, response, error) in
                if(error != nil){
                    print(error.debugDescription)
                }
                else{
                    do{
                        var response = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! [String:AnyObject]
                        self.listData = response["result"] as! [[String:AnyObject]]
                        DispatchQueue.main.async {
                            self.tableView.reloadData()
                        }
                    }catch let error as NSError{
                        print(error)
                    }
                }
                }.resume()
        }
    }

    // MARK: - Table view data source

    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.listData.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)

        let item = self.listData[indexPath.row]
        cell.textLabel?.text = item["MarketName"] as? String
        let lastValue = item["Last"] as? NSNumber
        cell.detailTextLabel?.text = lastValue?.stringValue
        print(self.listData.count)

        return cell
    }

这里的代码有几个问题:

首先,您在 viewDidLoad() 中定义了 sendUpdateRequest()。将整个函数移到这些大括号之外以消除该错误。其次,您不需要在 class.

之外定义 listData

然后您可以使用现有代码实现刷新功能。

对于“高”和“低”的列,您将需要 class 一个 UITableViewCell 并添加额外的标签。

按照此处列出的步骤操作:How to add more than two labels to prototype cell?

这就是您所需要的。复制粘贴整个代码。

import UIKit

class DemoJsonTableViewController: UITableViewController {

    var listData = [[String : AnyObject]]()

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.register(DrawerCell.self, forCellReuseIdentifier: "Cell")
        self.sendUpdateRequest()
        Timer.scheduledTimer(timeInterval: 10, target: self,   selector: (#selector(self.sendUpdateRequest)), userInfo: nil, repeats: true)

    }


    func sendUpdateRequest(){
        let url:String = "https://bittrex.com/api/v1.1/public/getmarketsummaries"

        let urlRequest = URL(string: url)

        URLSession.shared.dataTask(with: urlRequest!) { (data, response, error) in
            if(error != nil){
                print(error.debugDescription)
            }
            else{
                do{
                    var response = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! [String:AnyObject]
                    self.listData = response["result"] as! [[String:AnyObject]]
                    DispatchQueue.main.async {
                        self.tableView.reloadData()
                    }
                }catch let error as NSError{
                    print(error)
                }
            }
            }.resume()
    }


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

    // MARK: - Table view data source

    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.listData.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! DrawerCell

        let item = self.listData[indexPath.row]
        cell.TitleLabel.text = item["MarketName"] as? String
        cell.Description.text = String(describing: item["Last"] as? NSNumber)
        cell.HighLabel.text = String(describing: item["High"] as! NSNumber)
        cell.LowLabel.text = String(describing: item["Low"] as! NSNumber)
        return cell
    }

}




class DrawerCell: UITableViewCell {

    var TitleLabel: UILabel = UILabel()
    var Description: UILabel = UILabel()
    var HighLabel: UILabel = UILabel()
    var LowLabel: UILabel = UILabel()


    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)

        TitleLabel.textColor = UIColor.black
        TitleLabel.font = UIFont.init(name: "AppleSDGothicNeo-Bold", size: 10)
        TitleLabel.textAlignment = .left
        contentView.addSubview(TitleLabel)

        Description.textColor = UIColor.black
        Description.font = UIFont.init(name: "AppleSDGothicNeo-Bold", size: 8)
        Description.textAlignment = .left
        contentView.addSubview(Description)

        HighLabel.textColor = UIColor.black
        HighLabel.font = UIFont.init(name: "AppleSDGothicNeo-Bold", size: 10)
        HighLabel.textAlignment = .center
        contentView.addSubview(HighLabel)

        LowLabel.textColor = UIColor.black
        LowLabel.font = UIFont.init(name: "AppleSDGothicNeo-Bold", size: 10)
        LowLabel.textAlignment = .center
        contentView.addSubview(LowLabel)

    }

    override func layoutSubviews() {
        super.layoutSubviews()

        TitleLabel.frame = CGRect(x: 10, y: 0, width: self.frame.size.width - 110, height: 20)

        Description.frame = CGRect(x: 10, y: 20, width: self.frame.size.width - 110, height: 20)

        HighLabel.frame = CGRect(x: self.frame.size.width - 110, y: 0, width: 100, height: 20)

        LowLabel.frame = CGRect(x: self.frame.size.width - 110, y: 20, width: 100, height: 20)

    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }


    override public func prepareForReuse() {

        TitleLabel.text = nil
        Description.text = nil
        HighLabel.text = nil
        LowLabel.text = nil

    }
}