这是我的情况。
我有以下故事板: 所以,我有一个带有容器视图的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中的方法运行。我尝试了很多东西,但还没有办法解决这个问题。
答案 0 :(得分:2)
您应该使用委托。
在故事板中,单击embed segue并为其指定标识符。
让ViewController
符合TableViewCellDelegate
并在ViewController
中传递prepare(for:sender:)
的实例。
将单元格的委托设置为ViewController
' s TableViewController
中已通过的tableView(_:cellForRowAt:)
实例。按下按钮时,将调用视图控制器内的方法。
protocol TableViewCellDelegate: class {
func tableViewCellButtonPressed(_ sender: Any)
}
class TableViewCell: UITableViewCell {
weak var delegate: TableViewCellDelegate?
@IBAction func buttonClickedInCell(_ sender: Any) {
delegate?.tableViewCellButtonPressed(sender)
}
}
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
}
}
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)
}
}