从Swift

时间:2017-12-19 14:32:17

标签: ios swift uitableview delegates

我的目标是:

我有一个类getData,用于从服务器下载数据,然后将其保存到阵列。之后,我希望课程getData能够更新cellTableView中的HomeViewController

如果我在一个swift文件中拥有所有func,那么它可以工作。但是我想多次使用它并且不在每个UIViewController中使用相同的代码,我也想知道如何使用委托。

我尝试使用this回答类似的问题。

问题的探析:

现在代码下载和存储,但不是更新cellTableView

HomeViewController:

import UIKit

class HomeViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, GetDataDelegate {

    let getData = GetData()

    ...


    override func viewDidLoad() {
        super.viewDidLoad()

        cellTableView.delegate = self
        cellTableView.dataSource = self

        cellTableView.register(UINib(nibName: "HomeCell", bundle: nil), forCellReuseIdentifier: "homeCell")

        for (n, _) in MyVariables.coinTickerArray.enumerated() {
            MyVariables.dataArray.append(HomeLabel(coinNameCell: MyVariables.coinNameArray[n], tickerCell: MyVariables.coinTickerArray[n]))
        }

        getData.storeData()
    }

    ...

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let coinCell = tableView.dequeueReusableCell(withIdentifier: "homeCell", for: indexPath) as! HomeCell

        ...

        return coinCell
    }

    ...

    @IBAction func refreshButtonPressed(_ sender: UIBarButtonItem) {
        getData.storeData()
        self.didFinishGetData(finished: true)
    }

    @IBAction func currencyControlPressed(_ sender: UISegmentedControl) {

        ...

        getData.storeData()
    }

}

的GetData:

import UIKit
import Alamofire
import SwiftyJSON

class GetData {

    var delegate: GetDataDelegate?

    func downloadData(url: String, number: Int) {

        ...
    }

    func updateCoinData(json: JSON, number: Int) {

        ...

        self.delegate?.didFinishGetData(finished: true)
    }

    func storeData () {
        for (n, _) in MyVariables.coinTickerArray.enumerated() {

            MyVariables.finalURL = MyVariables.baseURL+MyVariables.coinTickerArray[n]+MyVariables.currentCurency
            downloadData(url: MyVariables.finalURL, number: n)

        }
    }  
}

查看+ GetDataDelegate:

import Foundation

extension HomeViewController: GetDataDelegate {
    func didFinishGetData(finished: Bool) {
        guard finished else {
            // Handle the unfinished state
            return
        }
        self.cellTableView.reloadData()
    }
}

GetDataDelegate:

import Foundation

protocol GetDataDelegate {
    func didFinishGetData(finished: Bool)
}

2 个答案:

答案 0 :(得分:1)

我无法从您发布的代码中判断出cellTableView的声明。我相信每个cellTableView的实例都应该用tableView替换。您在dataSource中调用tableView并委托方法,然后使用cellTableView重新加载数据。

您还应该更多地考虑代表团。最初获得这个概念是一个艰难的概念,但是一旦你得到它,这样的任务将是轻而易举的。

答案 1 :(得分:0)

是否调用了didFinishGetData?我认为它不是因为tableview没有重新加载。在您粘贴的代码中,您没有将getData委托设置为等于HomeViewController,在这种情况下,它是self。将此代码添加到viewDidLoad,它应该可以工作:

getData.delegate = self

如果这不起作用,那么您需要添加更多代码,因为我无法在调用updateCoinData时调用它,这会调用您的委托方法。