Intereting Posts
Swift – Вход с FireBase – Не удается получить данные пользователя после входа в систему Если мне не нужно постоянное хранилище, какова наилучшая практика хранения данных в стиле базы данных? NSMutableArray? Почему мой segue из ячейки UITableView для работы detailView? Есть ли способ ускорить преобразование HTML в NSAttributedString в iOS 8? Как страница Facebook в iOS google ios SDK swift fit bounds React Native показывает пустой экран SpriteKit – обнаружение, если узел обращается к другим дочерним узлам и выполняет действие Отображение Bump в OpenGL ES 2.0 / GLKit? NSString встроенный метод для сравнения числа похожих символов Запись метаданных в mp3-файл Поврежденная панель навигации после навигации Почему NEHotspotHelper registerWithOptions возвращает FALSE? Можно ли обрабатывать push-уведомления в проекте статической библиотеки в iOS? iOS – предупреждение о сохранении памяти для отображения изображения на Today Extension

Установка делегата пользовательского класса в контроллер View View

Я создал собственный класс, который является подклассом UICollectionReusableView . По сути, это заголовок раздела Collection View, и я добавляю несколько кнопок на нем. Когда кнопка нажата, я хочу, чтобы контроллер просмотра фильтровал результаты (в зависимости от того, какая кнопка нажата).

Мне нужен мой контроллер просмотра, чтобы иметь выход к этому настраиваемому классу, но это не сработало, потому что Xcode жалуется на повторный контент, имеющий классы (хотя я собираюсь использовать только один заголовок секции CollectionView). Поэтому мой следующий вариант – это делегирование.

Мой вопрос двоякий:

  1. Как настроить делегат своего класса на контроллер представления? Обычно я устанавливаю делегат в prepareForSegue но поскольку у меня нет этого, я не уверен, что делать. Мой контроллер просмотра создан в раскадровке, и мой пользовательский класс не имеет к нему ссылки. Даже в моем контроллере просмотра я не могу получить доступ к заголовку раздела коллекционного представления, чтобы настроить его делегат на себя (я проверил документацию Apple и нет свойства для доступа к заголовку раздела).

  2. Когда я устанавливаю 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 создается макетом потока в раскадровке, тогда вставьте в него кнопки в раскадровку и просто соедините их действия, как обычно.

введите описание изображения здесь

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

Когда кнопка постучана и активируется ее действие управляющего события, сама кнопка всегда предоставляется в качестве параметра. Это часть контроля.