如何将表视图的刷新控制实现为常用功能

时间:2018-12-18 22:12:42

标签: ios swift uitableview uirefreshcontrol

我有很多VC,其中有“表视图”,在其中添加了刷新控件。这是每个VC中的复制粘贴。我想将刷新控件移至扩展中的通用功能,但我不知道该怎么做。如果还有其他避免复制n粘贴的方法,请给我一些提示。

以下是我在VC.swift中典型的刷新控制实现

class MyVC: UIViewController {

    lazy var refreshControl: UIRefreshControl = {
        let refreshControl = UIRefreshControl()
        refreshControl.addTarget(self, action: #selector(refresh(_:)), for: UIControlEvents.valueChanged)
         return refreshControl
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        if #available(iOS 10.0, *) {
            messagesTable.refreshControl = refreshControl
        } else {
            messagesTable.addSubview(refreshControl)
       }
    }

    @objc func refresh(_ refreshControl: UIRefreshControl) {
        fetchData()
    }
}

1 个答案:

答案 0 :(得分:1)

如果您的所有ViewController内部都应具有TableView和RefreshControl,则可以为所有这些Controller创建一个超类(可以保留MyVC)。

class MyVC: UIViewController {

    lazy var refreshControl: UIRefreshControl = {
        let refreshControl = UIRefreshControl()
        refreshControl.addTarget(self, action: #selector(refresh(_:)), for: UIControlEvents.valueChanged)
        return refreshControl
    }()

    func addRefreshControl(to tableView: UITableView) {
        if #available(iOS 10.0, *) {
            tableView.refreshControl = refreshControl
        } else {
            tableView.addSubview(refreshControl)
        }
    }

    @objc func refresh(_ refreshControl: UIRefreshControl) {
        fetchData()
    }

    func fetchData() {
    }
}

然后将您的其他Controller子类设为MyVC,当您需要添加RefreshControl时,以控制器的TableView作为参数调用addRefreshControl

class MessageVC: MyVC {

    @IBOutlet weak var messageTable: UITableView!
    ...
    override func viewDidLoad() {
        super.viewDidLoad()
        ...
        addRefreshControll(to: messageTable)
    }
    ...
    override func fetchData() {
        // what should happen when refresh control changes its value
    }
}

...您还可以覆盖fetchData方法并声明刷新控件更改其值时应发生的情况