如何从协议函数中调用reloadData()

时间:2015-09-05 22:13:33

标签: swift uitableview protocols

我有一个半复杂的设置:

我有一个UITableViewController,它实现了一个名为CustomCellProtocol的协议,它使用自定义单元格,并将自身设置为自定义单元格的委托。自定义单元格中包含UIButtons。

我想要发生的是用户点击自定义单元格中的按钮,然后执行某些操作,然后重新加载表格。为此,我需要创建此协议委托设置。以下是相关代码:

protocol CustomCellProtocol {

    func didTapStar(cell: UITableViewCell, tag: Int)
    func didTapShortList(cell: UITableViewCell, tag: Int)

}

在TableViewController中:

func didTapStar(cell: UITableViewCell, tag: Int) {
        // This is called by a function within the custom cell
        dispatch_async(dispatch_get_main_queue(), { () -> Void in
            self.tableView.reloadData()
        })
}

在自定义单元格类中:

@IBAction func toggleReadStatus(sender: UIButton) {

    bookage.toggleReadStatus(sender.tag, state: "yes")
    delegate.didTapStar(self, tag: sender.tag)
}

令人高兴的是,整个设置工作正常,模型按预期更新,直到我需要调用tableView.reloadData()。由于某种原因,要么没有被调用,要么在执行其余代码之前被调用。我怀疑我需要找到一些方法来强制reloadData()在其他一切之后执行,但我不完全确定这里发生了什么。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

我转载了你的情况。有用。

的UITableViewController

import UIKit

class ViewController: UITableViewController {

    weak var delegate: CustomCellProtocol?

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        self.delegate = self
    }

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

}

extension ViewController: CustomCellProtocol {

    func didTapStar(cell: UITableViewCell, tag: Int) {
        dispatch_async(dispatch_get_main_queue(), { () -> Void in
            self.tableView.reloadData()
        })
    }

    func didTapShortList(cell: UITableViewCell, tag: Int) {

    }

}

CustomCell

import UIKit

protocol CustomCellProtocol: NSObjectProtocol {
    func didTapStar(cell: UITableViewCell, tag: Int)
    func didTapShortList(cell: UITableViewCell, tag: Int)
}

class CustomCell: UITableViewCell {

    var delegate: CustomCellProtocol?

    @IBAction func toggleReadStatus(sender: UIButton) {
        delegate?.didTapStar(self, tag: sender.tag)
    }

}