自定义单元格中的按钮,ViewController方法

时间:2017-09-23 07:51:43

标签: ios swift uitableview swift3

这是我的情况。

我有以下故事板: Storyboard 所以,我有一个带有容器视图的ViewController和一个tableViewController。这个tableViewController通过控件 - 从一个控件拖动到另一个嵌入在ContainerView中。

现在,我有以下几个类:

ViewController: 这是故事板中ViewController的类。

class ViewController: UIViewController {

  override func viewDidLoad() {
      super.viewDidLoad()
  }

func printText(message: String, custom: SomeCustomType) {
print("Button in cell clicked and parameters passed successfully to VC")
//....
}

然后我有一个TableViewController来管理tableViewController: 这是Storyboard中tableViewController的自定义类。

Class TableViewController: UITableViewController {

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cellIdentifier = "TableViewCell"

        guard let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as? TableViewCell else {
            fatalError("The dequeued cell is not an instance of TableViewCell.")
        }

        // Configure the cell...            

        return cell
    }

    //And other functions such as 'numberOfSections', 'numberOfRows'
}

最后,我有一个tableViewCell类来连接所有单元的插座等: 这是tableViewController中自定义tableViewCell的自定义类。

Class TableViewCell: UITableViewCell {

  @IBAction func buttonClickedInCell(_ sender: Any) {
  }

}

我想要它做的是当我按下单元格中的按钮时,我希望VC中的方法运行。我尝试了很多东西,但还没有办法解决这个问题。

2 个答案:

答案 0 :(得分:2)

您应该使用委托

在故事板中,单击embed segue并为其指定标识符。

enter image description here

ViewController符合TableViewCellDelegate并在ViewController中传递prepare(for:sender:)的实例。

将单元格的委托设置为ViewController' s TableViewController中已通过的tableView(_:cellForRowAt:)实例。按下按钮时,将调用视图控制器内的方法。

代表

protocol TableViewCellDelegate: class {
    func tableViewCellButtonPressed(_ sender: Any)
}

TableViewCell

class TableViewCell: UITableViewCell {
    weak var delegate: TableViewCellDelegate?

    @IBAction func buttonClickedInCell(_ sender: Any) {
        delegate?.tableViewCellButtonPressed(sender)
    }
}

TableViewController

class TableViewController: UITableViewController {
    weak var tableViewCellDelegate: TableViewCellDelegate?

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cellIdentifier = "TableViewCell"

        guard let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as? TableViewCell else {
            fatalError("The dequeued cell is not an instance of TableViewCell.")
        }

        cell.delegate = tableViewCellDelegate

        return cell
    }
}

的ViewController

class ViewController: UIViewController, TableViewCellDelegate {
    var tableVc: TableViewController!

    func tableViewCellButtonPressed(_ sender: Any) {
        //do whatever you want after pressing the button
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "embedTable" {
            tableVc = segue.destination as! TableViewController
            tableVc.tableViewCellDelegate = self
        }
    }
}

答案 1 :(得分:0)

如果您的项目可行,请尝试NotificationCenter

ViewController添加以下两种方法:

override func viewWillAppear(_ animated: Bool) {
    NotificationCenter.default.addObserver(self, selector: #selector(ViewController.notificationCellButtonClicked(nsotification:)), name: NSNotification.Name(rawValue: "CellButtonClicked"), object: nil)
}

func notificationCellButtonClicked(nsotification: NSNotification) {
    // Your logic to perform

}

override func viewDidDisappear(_ animated: Bool) {
    NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue:"CellButtonClicked"), object: nil)
}

然后在你的自定义tableViewCell中:

Class TableViewCell: UITableViewCell {

  @IBAction func buttonClickedInCell(_ sender: Any) {
     NotificationCenter.default.post(name: NSNotification.Name(rawValue: "CellButtonClicked"), object: nil)
  }

}