我的目标是:
我有一个类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)
}
答案 0 :(得分:1)
我无法从您发布的代码中判断出cellTableView的声明。我相信每个cellTableView的实例都应该用tableView替换。您在dataSource中调用tableView并委托方法,然后使用cellTableView重新加载数据。
您还应该更多地考虑代表团。最初获得这个概念是一个艰难的概念,但是一旦你得到它,这样的任务将是轻而易举的。
答案 1 :(得分:0)
是否调用了didFinishGetData?我认为它不是因为tableview没有重新加载。在您粘贴的代码中,您没有将getData委托设置为等于HomeViewController,在这种情况下,它是self。将此代码添加到viewDidLoad,它应该可以工作:
getData.delegate = self
如果这不起作用,那么您需要添加更多代码,因为我无法在调用updateCoinData时调用它,这会调用您的委托方法。