2017-02-15 3 views
0

В настоящее время мой заголовок приложения представляет собой полный UIView с шириной 65pt, который затем я использую как общий заголовок для всех страниц.Перейдите к UIViewController из UIView

class AppHeader: UIView { 
    ... 
} 

Тогда в моем Main.storyboard У меня есть UIViewController с видом из библиотеки объектов, который имеет свой класс, определенный параметр AppHeader.

My AppHeader (UIView) имеет несколько кнопок, которые должны, если щелкнуть, перевести вас с страницы/контроллера, в которой вы сейчас находитесь, на другой.

Из класса AppHeader У меня нет доступа к использованию данного метода, чтобы показать другой контроллер, поскольку он не входит в область видимости.

Вот мой AppHeader.xib:

enter image description here

Как я могу решить эту проблему?

ответ

1

Это очень плохое поведение, вы не должны использовать UIView в качестве заголовка. Вы должны добавить контроллер просмотра навигации в качестве первого контроллера представления вашего приложения. Контроллер навигационного представления имеет навигационную панель, в которой вы можете поместить нужные кнопки. Из этого вы сможете нажать или представить другие контроллеры представлений.

Проверьте официальная документация: https://developer.apple.com/library/content/documentation/WindowsViews/Conceptual/ViewControllerCatalog/Chapters/NavigationControllers.html

+0

О, я просто посмотрел на картину. Он дублирует поведение навигационной панели, не так ли? –

1

Сделайте свое AppHeader просмотреть пользовательский подкласс UIView, если это уже не. Подключите действия на кнопке до IBAction методов в представлении.

Создать протокол AppHeaderDelegateProtocol. Дайте вашему AppHeader классу слабое свойство делегата. Определите методы в этом протоколе, которые позволяют AppHeader сообщать владельцу о контроле над кнопками.

Внесите свои AppHeaderDelegateProtocol в контроллеры, которые будут содержать экземпляры AppHeader.

Соедините свойство делегата с каждым экземпляром контроллера видимости AppHeader.

Это должно быть сделано.

+0

Мой ответ дает способ делать то, что вы просите, но, как говорит Джоан в своем ответе, лучшим ответом является «Не делайте этого». –

0

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

Документы Apple по протоколам here.

В качестве альтернативы вы можете использовать NotificationCenter для широковещательных уведомлений, чтобы абоненты знали, что нажата определенная кнопка, и ваши наблюдатели отслеживают эти уведомления и реагируют на них соответствующим образом. Вы должны управлять, когда классы начинают/останавливают прослушивание, хотя, поскольку у вас может быть несколько объектов, пытающихся реагировать на одно уведомление.