Отключение UIPopoverController изнутри своего ContentViewController?
Если вы хотите отклонить popover - например, с помощью кнопки в popover contentViewController вы должны -
- Создайте ссылку на popover, которая будет храниться контроллером вида, который создает его.
- Создайте уведомление от ContentViewController, чтобы позволить владельцу контроллера представления знать, что его следует отклонить, или поочередно создать делегат для той же цели
- Отправлять уведомление или делегировать сообщение, когда popover готов к увольнению.
- Вызов
dismissPopover:animated
при вызове метода уведомления или делегата
Между тем, из UIViewController
вы можете получить доступ к контроллеру модального представления, контроллеру родительского представления, контроллеру навигации, контроллеру разделенного вида, контроллеру панели вкладок, контроллеру отображения поиска, контроллерам дочерних элементов, представлению представления контроллеров и представленных контроллеров представлений.
Есть ли лучший способ сделать это из popover contentViewController?
Ответы
Ответ 1
К сожалению, вам придется создать ссылку на слабый объект для упомянутого UIPopoverController
, так как нет способа получить доступ к нему из контроллера содержимого.
Я был удивлен, как UIViewControllers могут получить доступ к модульному контроллеру просмотра, контроллеру родительского представления, контроллеру навигации, контроллеру разделенного вида, контроллеру панели вкладок, контроллеру отображения поиска, а с iOS 5 - контроллерам детского вида, а также представить и представить контроллеры... но не контроллер popover (предоставленные popovers не UIViewController
, но все же).
Технически существует частный недокументированный метод для получения popoverController, в котором находится UIViewController... Я понятия не имею, почему они никогда не публиковали его, поскольку он должен быть точно таким же, как любой из вышеперечисленных контроллеров.
Хотя даже в закрытом, недокументированном мире нет эквивалента dismissModalViewcontrollerAnimated:
. Вам все равно придется получить эту ссылку, а затем отпустите ее таким образом.
Ответ 2
Другим способом решения этого вопроса является создание абстрактного контроллера представлений (для всех ваших контроллеров представлений), который добавляет наблюдателя NSNotification
к методу, например -(void)closePopoverIfNecessary:(NSNotification*)notification
, и имеет дочерние классы, которые необязательно реализуют метод для закрытия своего popover ( s) если открыто. Затем изнутри контроллера popover вы запускаете уведомление, чтобы закрыть его. Вы также можете передать другую информацию через уведомление (userInfo), если это необходимо.
Таким образом, нет необходимости в родительских ссылках.