我有一个动态生成的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
中,我没有表的任何实例,所以这就是我现在的问题:|
答案 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()
}
}