UICollectionViewCell получает доступ к своему родительскому UICollectionViewController

У меня возникли проблемы с UICollectionViewController, который регистрирует пользовательский UICollectionViewCell в качестве заголовка. Пожалуйста, смотрите прикрепленную картинку.

Скриншот раскадровки

На средней диаграмме - UICollectionViewController, а красный квадрат выделяет UIImageView, который находится внутри UICollectionViewCell, зарегистрированного в качестве заголовка. Я пытаюсь получить результат правильной диаграммы, такой, что при нажатии UIImageView ячейки заголовка UIView со списком информации скользит вверх снизу.

Это структура моего кода на данный момент:

1) Swift-файл UIView, содержащий список информации.

2) Создание UIView и добавление его в подпредставление в моем UICollectionViewController.

Так как UIImageView(значок информационного круга) существует в UICollectionViewCell, я сделал его userInteractionEnabled и добавил к нему TapGestureRecognizer. Однако, поскольку я хочу анимировать UIView вверх из UICollectionViewController, я не уверен, как получить доступ к свойству UIView в UICollectionViewController из моего заголовочного файла UICollectionViewCell.

Я знаю, это звучит очень странно, но если кто-то может указать мне правильное направление или, возможно, предложить реструктуризацию моего кода, я был бы очень признателен. Если вам нужна дополнительная информация, пожалуйста, дайте мне знать. Большое спасибо за вашу помощь.

Редактировать обновление: Большое спасибо Джону за подробное объяснение. На первый взгляд, я думал, что протокол будет просто применяться ко всему UICollectionViewCell, но затмевал тот факт, что это delegate?.clicked() в Gesture Recognizer, который ограничивает область действия. Ваша помощь очень ценится, Джон. Надеюсь, что это помогает другим с подобными проблемами.

1 ответ

Решение

Чтобы попасть туда, вы должны реализовать протокол на UICollectionViewCell, где вы будете сообщать родителю, что ячейка нажата и какое действие она должна предпринять следующим образом:

protocol MyCellDelegate: class {
    func clicked()
    func other()
}

class MyCell: UIColletionViewCell  {
    weak var delegate : MyCellDelegate?

    //call delegate?.clicked() where you have the gesture recogniser 

}

Затем в cellForItemAtIndexPath или везде, где вы используете MyCell, напишите следующее

 cell.delegate = self

Затем реализуйте расширение для вашего класса:

 extension MyCollectionView: MyCellDelegate {
     func clicked() {
     //present the view here (the slide up)
     }
  }
Другие вопросы по тегам