В моем UISplitViewController
главный контроллер - UINavigationController
.
Когда в портретном режиме я хотел бы держать навигационный контроллер видимым до тех пор, пока пользователь будет перемещаться вверх (используя кнопку "Назад" ). Как только элемент из представления таблицы контроллера навигации выбран, я хочу отклонить popover.
Как я могу это достичь? Как может мой UITableViewController
узнать, находится ли он внутри popover, и если да, отпустите его?
UISplitViewController в портретной: как программно скрыть мастер поповер?
Ответ 1
Сделайте свой основной контроллер представления UISplitViewControllerDelegate
(если он еще не установлен) и подключите его к выходу UISplitViewController delegate
.
Создайте переменную UIPopoverController
в главном контроллере представления:
// MyViewController.h
@interface MyViewController : UIViewController <UISplitViewControllerDelegate> {
UIPopoverController *popoverController;
}
@property (retain, nonatomic) UIPopoverController *popoverController;
// MyViewController.m
@synthesize popoverController;
Внедрите следующие методы UISplitViewControllerDelegate:
// Called when rotating to portrait
- (void)splitViewController:(UISplitViewController*)svc
willHideViewController:(UIViewController *)aViewController
withBarButtonItem:(UIBarButtonItem*)barButtonItem
forPopoverController:(UIPopoverController*)pc {
// Popover controller is visible in portrait
self.popoverController = pc;
}
// Called when rotating to landscape
- (void)splitViewController:(UISplitViewController*)svc
willShowViewController:(UIViewController *)aViewController
invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem {
// No popover controller in landscape view
self.popoverController = nil;
}
В вашем собственном обработчике в главном контроллере представления (тот, который вызывается, когда элемент навигации выбран в виде таблицы):
- (void)navigationControllerSelectedItem:(id)item {
// If a popover controller is visible, hide it
if (popoverController) {
[popoverController dismissPopoverAnimated:YES];
}
}
И не забудьте выпустить эту переменную:
- (void)dealloc {
self.popoverController = nil;
[super dealloc];
}
Надеюсь, что это поможет!
Ответ 2
Стандартный образец iPad для SplitViewController в iOS5 делает примерно то же, что и сложный ответ, но popoverController называется masterPopoverController.
И создание стиля iOS5 свойства как _popoverController не работает, потому что там уже есть ivar с этим именем в UIViewController.h.
Ответ 3
В шаблоне SplitView IOS 6.0 встроена эта функция. Детальный вид отслеживает ориентацию и всплывающее окно MasterViewController.
Просто установите параметр detailItem, и при необходимости исчезнет popover. Существует даже проверка, если вы используете один и тот же detaiItem, поэтому никакая настройка страницы и обновление не выполняются.
self.detailViewController.detailItem = self.detailViewController.detailItem;