有没有办法通过其中一个单元格中的按钮刷新整个UITableView?

时间:2016-09-24 00:25:32

标签: ios swift uitableview swift-protocols

我有一个动态生成的UITableView,包含许多动态UITableViewCells和一个静态UITableViewCell

静态按钮有一个按钮,我想在用户按下它时刷新整个表视图。

我附加到单元格的代码很简单:

class MyStaticCell: UITableViewCell {

    @IBOutlet weak var sendCommentButton: UIButton!

    @IBAction func sendCommentButtonAction(sender: AnyObject) {

        //from here I want to refresh the table

    }
}

如何从该按钮刷新父表?在类MyStaticCell中,我没有表的任何实例,所以这就是我现在的问题:|

2 个答案:

答案 0 :(得分:3)

最简洁的方法是通过授权。这确保了细胞类不需要知道按下按钮时应该发生什么;该逻辑可以保留在它所属的视图控制器中。

protocol CommentButtonProtocol {

    func commentButtonTapped(sender: MyStaticCell)
}

class MyStaticCell: UITableViewCell {

    @IBOutlet weak var sendCommentButton: UIButton!

    var delegate: CommentButtonProtocol?

    @IBAction func sendCommentButtonAction(sender: AnyObject) {

        self.delegate?.commentButtonTapped(self)

    }
}

然后在您的视图控制器中,您可以将其设置为cellForRowAtIndexPath中的委托并遵守协议以处理该事件:

class ViewController: UIViewController, CommentButtonProtocol {

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("staticCell", forIndexPath: indexPath) as! MyStaticCell
        cell.delegate = self
        return cell
    }

    func commentButtonTapped(sender: MyStaticCell) {
        // Do whatever you need to do when the button is tapped
    }

} 

答案 1 :(得分:2)

您可以使用superview访问tableView。

class MyStaticCell: UITableViewCell {

    @IBOutlet weak var sendCommentButton: UIButton!

    @IBAction func sendCommentButtonAction(sender: AnyObject) {

        (superview as? UITableView)?.reloadData()
    }
}

这不是很稳定,所以可以考虑这个扩展名:

extension UIResponder {

    func nextResponder<T: UIResponder>(ofType type: T.Type) -> T? {

        switch nextResponder() {

        case let responder as T:
            return responder

        case let .Some(responder):
            return responder.nextResponder(ofType: type)

        default:
            return nil
        }
    }
}

它允许您在单元格中找到特定类型的下一个父级UITableView

class MyStaticCell: UITableViewCell {

    @IBOutlet weak var sendCommentButton: UIButton!

    @IBAction func sendCommentButtonAction(sender: AnyObject) {

        nextResponder(ofType: UITableView.self)?.reloadData()
    }
}