Кнопка в пользовательской ячейке, метод 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)
  }

}
Другие вопросы по тегам