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)
}
}