Кнопка в пользовательской ячейке, метод ViewController
Вот моя ситуация.
У меня есть следующая раскадровка: Итак, у меня есть 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: это пользовательский класс tableViewController в Storyboard.
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, к которому можно подключить все выходы ячейки и т. Д. Это пользовательский класс пользовательского tableViewCell, который находится в tableViewController.
Class TableViewCell: UITableViewCell {
@IBAction func buttonClickedInCell(_ sender: Any) {
}
}
То, что я хочу сделать, это когда я нажимаю кнопку в ячейке, я хочу запустить метод в VC. Я перепробовал несколько вещей, но пока не нашел способ сделать это.
2 ответа
Вы должны использовать делегата для этого.
В раскадровке нажмите на код для вставки и дайте ему идентификатор.
Делать ViewController
соответствовать TableViewCellDelegate
и передать экземпляр ViewController
в prepare(for:sender:)
,
Установите делегата ячейки на переданный ViewController
экземпляр в TableViewController
"s 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
}
}
}
Если возможно в вашем проекте, попробуйте 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)
}
а затем в вашей пользовательской таблице ViewCell:
Class TableViewCell: UITableViewCell {
@IBAction func buttonClickedInCell(_ sender: Any) {
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "CellButtonClicked"), object: nil)
}
}