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

How to call reloadData() from within protocol function

我有一个半复杂的设置:

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

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

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()
        })
}

在自定义单元格内 class:

@IBAction func toggleReadStatus(sender: UIButton) {

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

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

有什么建议吗?

我复现了你的情况。有用。

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) {

    }

}

自定义单元格

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)
    }

}