从Swift中的另一个类刷新UITableView

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从Swift中的另一个类刷新UITableView相关的知识,希望对你有一定的参考价值。

我的目标是:

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

如果我在一个快速文件中有所有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)
}
答案

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

getData.delegate = self

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

另一答案

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

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

以上是关于从Swift中的另一个类刷新UITableView的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Swift SpriteKit 中的另一个 SKScene 访问变量

如何初始加载 UITableView 然后观察 Firebase 节点以更改在 Swift 中刷新 tableview?

是否可以根据从 Swift 中的 UIViewController 继承的类中的另一个来初始化变量?

下拉刷新时 UITableview 出错,所有数据重复。任何人都可以帮助使用 Swift 3 , Xcode 8

嵌入在容器中的 UITableView 不刷新

将数据源分离到 Swift 中的另一个类