Кнопка контроллера Popover iOS UISplitViewController исчезает после нажатия нового контроллера просмотра в портретном режиме

В моем приложении UISplitViewController у меня есть

  • RootViewController – просмотр контроллера в левой панели.
  • DetailViewController – просмотр контроллера в правой панели.

Когда один элемент (который находится в UITableView) в RootViewController используется, новый контроллер представления будет установлен следующим образом:

[detailViewController setViewControllers:[NSArray arrayWithObjects:newViewController, nil] animated:animated];

//detailPane is my DetailViewController

Все работает очень хорошо в ландшафтном режиме. Тем не менее, я не могу заставить UISplitViewController работать так, как я хочу, в портретном режиме, то есть кнопка Popover от RootViewController не отображается должным образом в моем DetailViewController при запуске и использовании приложения в режиме portait.

Когда я запускаю приложение в портретном режиме, кнопка popover отображается соответствующим образом. Но после нажатия одного элемента в popover и нового контроллера представления был установлен на detailViewController, кнопка исчезла. Я должен повернуть устройство на пейзаж, а затем снова вернуться к портфолио, чтобы снова появилась кнопка.

Я назначил делегата UISplitViewController в AppDelegate приложения следующим образом:

self.splitViewController.delegate = self.detailViewController

И вот моя реализация UISplitViewControllerDelegate

 - (void)splitViewController: (UISplitViewController*)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem*)barButtonItem forPopoverController: (UIPopoverController*)pc { NSLog(@"Will hide view controller"); barButtonItem.title = @"Menu"; [self.navigationItem setLeftBarButtonItem:barButtonItem]; self.popoverController = pc; } - (void)splitViewController: (UISplitViewController*)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem { NSLog(@"Will show view controller") NSMutableArray *items = [self.navigationItem.leftBarButtonItems mutableCopy]; [items removeAllObjects]; [self.navigationItem setLeftBarButtonItems:items animated:YES]; [items release]; self.popoverController = nil; } 

Любые намеки или помощь приветствуются. Благодарю.

4 Solutions collect form web for “Кнопка контроллера Popover iOS UISplitViewController исчезает после нажатия нового контроллера просмотра в портретном режиме”

Просто придумал новое решение.

Подкласс UINavigationController и реализует UISplitViewControllerDelegate . Установите экземпляр этого класса в качестве правильного ViewController для splitViewController. Каждый раз, когда вы хотите изменить контроллер представления подробностей из мастера

 NewDetailViewController *newDetailVC = ....// Obtain the new detail VC newDetailVC.navigationItem.leftBarButtonItem = [[[[self.splitViewController.viewControllers objectAtIndex:1]topViewController]navigationItem ]leftBarButtonItem]; //With this you tet a pointer to the button from the first detail VC but from the new detail VC [[self.navigationController.splitViewController.viewControllers objectAtIndex:1]setViewControllers:[NSArray arrayWithObject:newDetailVC]]; //Now you set the new detail VC as the only VC in the array of VCs of the subclassed navigation controller which is the right VC of the split view Controller 

Это работает для меня, и я могу избежать определения протокола дыр и установки мастера как делегата, что является большим компромиссом. Надеюсь, поможет.

Если вам все еще нужно:

http://developer.apple.com/library/ios/#samplecode/MultipleDetailViews/Introduction/Intro.html

Что я сделал с моим источником (у меня была аналогичная настройка для вас), чтобы исправить это:

У меня есть master viewcontroller (UITableViewController в моем случае) является делегатом UISplitViewController. В двух методах делегата для UISplitViewControllers (так что это будет в вашей реализации master viewcontroller) вы бы сохранили popupviewcontroller и barbuttonitem в своем классе. Теперь, если вы измените свой просмотр viewcontroller, выполните следующие действия:

 self.viewControllers = [NSArray arrayWithObjects:[self.viewControllers objectAtIndex:0], newDetailsViewController, nil]; UIViewController <SubstitutableDetailViewController>*vc = (UIViewController <SubstitutableDetailViewController>*)newDetailsViewController; [vc invalidateRootPopoverButtonItem:_tableViewController.rootPopoverButtonItem]; [_createReportViewController showRootPopoverButtonItem:_tableViewController.rootPopoverButtonItem]; 

где мы имеем

 @protocol SubstitutableDetailViewController - (void)showRootPopoverButtonItem:(UIBarButtonItem *)barButtonItem; - (void)invalidateRootPopoverButtonItem:(UIBarButtonItem *)barButtonItem; @end 

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

 - (void)showRootPopoverButtonItem:(UIBarButtonItem *)barButtonItem { self.navigationItem.leftBarButtonItem = barButtonItem; } - (void)invalidateRootPopoverButtonItem:(UIBarButtonItem *)barButtonItem { self.navigationItem.leftBarButtonItem = nil; } 

Дайте мне знать, если это вам поможет.

Мне понравилось решение Некто, но он пропустил одну ключевую проблему.

Непонятно, какое action: селектор заставит UISplitViewController отобразить MasterViewController в popover. Когда я, наконец, понял это, изучив BarButtonItem в отладчике, я понял, почему было так сложно понять это action: селектор action: не документирован нигде в SDK от Apple iOS. К сожалению.

Попробуй это:

 UIBarButtonItem *showListView = [[UIBarButtonItem alloc] initWithTitle:@"List" style:UIBarButtonItemStyleBordered target:[self splitViewController] action:@selector(toggleMasterVisible:)]; [[detailViewController navigationItem] setLeftBarButtonItem:showListView]; 

Вы можете захотеть окружить этот код условным, который проверяет, что окно находится в портретном режиме, например if ([self interfaceOrientation] == UIInterfaceOrientationPortrait)

Когда вы устанавливаете новые контроллеры представлений, размещенные в navigation stack , возможно, все кнопки навигации сбрасываются. Вы можете вручную добавить соответствующие кнопки после изменения navigation stack .

Например, вы можете выбрать код из - (void)splitViewController: (UISplitViewController*)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem*)barButtonItem forPopoverController: (UIPopoverController*)pc где создана кнопка контроллера popover контроллера по умолчанию:

 UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithTitle:@"Menu" style:UIBarButtonItemStyleBordered target:self action:@selector(appropriateSelector)]; [self.navigationItem setLeftBarButtonItem:barButtonItem]; self.popoverController = pc; 
  • Как использовать собственный sqlite в веб-обзоре ios?
  • Могу ли я использовать PAN через Bluetooth для подключения аксессуара к iPad?
  • UIViewController - UIModalPresentationCurrentContext не вращает presentingViewController
  • Приложение iOS неоднократно отклонялось из AppStore из-за: 2.2. Приложения, отображающие ошибки, будут отклонены
  • Расположение и ориентация клавиатуры iOS
  • Отсутствует строка заголовка в подробном представлении UISplitViewController
  • Почему мое устройство iOS не распознает мой голос?
  • Как получить реальные значения цвета RGBA или ARGB без предварительной мультиплексированной альфы?
  • Как прочитать данные первого столбца из файла CSV и сравнить его с пользовательским вводом?
  • Как FlipFromLeft?
  • Мне действительно нужен файл MainWindow.xib?
  • Interesting Posts

    Извлечь агрегированные данные из NSManagedObject, используя другое выражение в качестве аргумента для выражения sum: expression

    UITableView с пользовательским пейджинговым поведением

    Должен ли я писать свое приложение с Sencha Touch или Native?

    instantiateViewControllerWithIdentifier показывает пустой вид (xcode 4.5)

    Аудио / видео не синхронизировано после камеры переключения

    CocoaPods как установить только одну новую библиотеку

    Как утвердить значение TextView в XCode7 iOS9?

    Изменение цвета ссылки в NSMutableAttributedString

    Немодальное прозрачное информационное оповещение в iOS

    Ошибка установки Xcode 8 beta 2

    В чем разница между одиночными векторными и векторными переопределениями?

    Safari изменяет функции ARIA HTML?

    Установка индикатора активности в CollectionViewCell

    Найдите количество маршрутов между двумя местами

    Api для чтения журналов устройств на iOS 8

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.