Как обнаружить нажатие кнопки в UITableViewCell, который находится в UICollectionViewCell? - PullRequest
0 голосов
/ 14 января 2019

Я пытаюсь обнаружить нажатие кнопки в UITableViewCell, которое находится в UICollectionViewCell.

Делегат

UICollectionView и источник данных - мой ViewController. В каждом UICollectionViewCell есть один UITableView. А делегатом и источником данных UITableViewCell является UICollectionViewCell.

Мне нужно обнаружить нажатия кнопок в ViewController.

ViewController

@IBOutlet collectionView: UICollectionView!

override func viewDidLoad() {
    super.viewDidLoad()
    collectionView.delegate = self
    collectionView.dataSource = self
}

UICollectionView

@IBOutlet tableView: UITableView!

override func awakeFromNib() {
    super.awakeFromNib()
    tableView.delegate = self
    tableView.dataSource = self
}

UITableViewCell

@IBAction func buttonTapped(_ sender: CustomButton) {
    // Detect Button Tap in ViewController
}

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Вы можете написать свой собственный делегат для этого.

protocol ButtonDelegate: class {
    func buttonTapped(_ button: UIButton)
}

Затем внедрите его в свой ViewController и делайте все, что хотите, когда нажимаете кнопку.

В вашем UICollectionView и UITableViewCell добавьте свойство:

weak var buttonDelegate: ButtonDelegate?

А затем измените ваш UITableViewCell:

@IBAction func buttonTapped(_ sender: CustomButton) {
    buttonDelegate?.buttonTapped(sender)
}

В ViewController необходимо установить делегата на UICollectionView:

collectionView.buttonDelegate = self

Наконец, в вашем методе cellForRowAt в вашем UICollectionView установите для свойства buttonDelegate UITableViewCell значение buttonDelegate для UICollectionView, то есть ваше ViewController:

cell.buttonDelegate = buttonDelegate
0 голосов
/ 14 января 2019

Я бы предложил вам использовать шаблон делегата.


Итак, вам нужен один протокол для ячейки табличного представления и один для ячейки табличного представления

protocol TableCellDelegate: class {
     func buttonPressed(_ sender: CustomButton)
}

protocol CollectionCellDelegate: class {
     func buttonInTableCellPressed(_ sender: CustomButton)
}

теперь создайте delegate переменные для подклассов ячеек

class TableCell: ... {
    weak var delegate: TableCellDelegate?
}

class CollectionCell: ... {
    weak var delegate: CollectionCellDelegate?
}

продолжить реализацию TableCellDelegate до CollectionView и вызвать метод для делегата ячейки внутри метода делегата ячейки таблицы

extension CollectionCell: TableCellDelegate {
    func buttonPressed(_ sender: CustomButton) {
        delegate?.buttonInTableCellPressed(sender)
    }
}

следующий орудие CollectionCellDelegate на вашем контроллере вида

extension ViewController: CollectionCellDelegate {
    func buttonInTableCellPressed(_ sender: CustomButton) {
        ... // this is called when button in table view cell is pressed
    }
}

Теперь не забудьте установить делегат ячейки коллекции внутри cellForItemAt в ViewController и делегат ячейки таблицы внутри cellForRowAt в CollectionCell

class ViewController: UICollectionViewDelegate, UICollectionViewDataSource {
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        ...
        cell.delegate = self
        ...
    }
}

class CollectionCell: UICollectionViewCell, UITableViewDelegate, UITableViewDataSource {
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        ...
        cell.delegate = self
        ...
    }
}

Теперь, наконец, вызов метода для делегата внутри ячейки таблицы при нажатии кнопки

@IBAction func buttonTapped(_ sender: CustomButton) {
    delegate?.buttonPressed(sender)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...