UISplitViewController в портретной: как программно скрыть мастер поповер?

В моем UISplitViewController главный контроллер - UINavigationController. Когда в портретном режиме я хотел бы держать навигационный контроллер видимым до тех пор, пока пользователь будет перемещаться вверх (используя кнопку "Назад" ). Как только элемент из представления таблицы контроллера навигации выбран, я хочу отклонить popover. Как я могу это достичь? Как может мой UITableViewController узнать, находится ли он внутри popover, и если да, отпустите его?

Ответ 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;