Я создал собственный класс, который является подклассом UICollectionReusableView
. По сути, это заголовок раздела Collection View, и я добавляю несколько кнопок на нем. Когда кнопка нажата, я хочу, чтобы контроллер просмотра фильтровал результаты (в зависимости от того, какая кнопка нажата).
Мне нужен мой контроллер просмотра, чтобы иметь выход к этому настраиваемому классу, но это не сработало, потому что Xcode жалуется на повторный контент, имеющий классы (хотя я собираюсь использовать только один заголовок секции CollectionView). Поэтому мой следующий вариант – это делегирование.
Мой вопрос двоякий:
Как настроить делегат своего класса на контроллер представления? Обычно я устанавливаю делегат в prepareForSegue
но поскольку у меня нет этого, я не уверен, что делать. Мой контроллер просмотра создан в раскадровке, и мой пользовательский класс не имеет к нему ссылки. Даже в моем контроллере просмотра я не могу получить доступ к заголовку раздела коллекционного представления, чтобы настроить его делегат на себя (я проверил документацию Apple и нет свойства для доступа к заголовку раздела).
Когда я устанавливаю IBAction
s в свой пользовательский класс, как я могу гарантировать, что кнопка, которая была прослушена, также передается в качестве отправителя? Я связал одну из кнопок с действием и написал func someAction (sender: AnyObject) {}
но как программа знает, что сама кнопка должна быть передана в качестве отправителя?
Вот мой код:
// Custom Class class CollectionHeaderView: UICollectionReusableView { @IBAction func buttonPressed (sender: AnyObject) { **delegate?.didTapButton(self)** } var delegate: UICollectionViewDelegate? } // Protocol protocol CollectionHeaderViewDelegate { func didTapButton(sender: CollectionHeaderView) } // View Controller (the delegate) func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView { let headerView = collectionView.dequeueReusableSupplementaryViewOfKind(kind, withReuseIdentifier: "CollectionHeaderView", forIndexPath: indexPath) as! CollectionHeaderView headerView.delegate = self return headerView } extension BrowseViewController: CollectionHeaderViewDelegate { func didTapButton(sender: CollectionHeaderView) { print("Delegate's Button Tapped") } }
Выделенная область – это где Xcode дает мне сообщение об ошибке: «Значение типа UICollectionViewDelegate не имеет члена« Did Tap Button »- не знаю, почему это относится к UICollectionViewDelegate. Я попытался изменить имя переменной и вызов нажать делегат в headerViewDelegate, но он все же дал ошибку.
Если этот UICollectionReusableView является заголовком раздела в виде коллекции, вы можете создать его в коде. Вам нужно было бы реализовать collectionView:viewForSupplementaryElementOfKind:atIndexPath:
В этот момент вы (контроллер вида) создаете заголовок раздела и можете настроить его любым способом.
В качестве альтернативы, если этот UICollectionReusableView создается макетом потока в раскадровке, тогда вставьте в него кнопки в раскадровку и просто соедините их действия, как обычно.
но как программа знает, что сама кнопка должна быть передана в качестве отправителя
Когда кнопка постучана и активируется ее действие управляющего события, сама кнопка всегда предоставляется в качестве параметра. Это часть контроля.