Кнопка контроллера 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; 
  • Аннотируйте представление таблицы на iPad Pro с карандашом
  • отключить ipad от создания меток на карте google
  • Как сканировать штрих-коды на iOS?
  • Создание другого устройства вывода в приложении iOS с различным контентом
  • UIPrintInteractionController не отображается в iPad
  • iPhone: UIImageView исчезает в - Howto?
  • iOS - Генерация PDF из UIView путем рендеринга теряет качество
  • Подклассификация UIApplication для переопределения sendEvent вызывает сбой
  • Настройки info.plist для iPad только для приложения
  • Различать ориентацию iPad с классами размера
  • Сделайте UIView и subviews полупрозрачными как один слой, а не индивидуально
  • Interesting Posts

    Как кэшировать изображения только на диске с помощью Kingfisher?

    ios – схема URL-адреса whatsapp не работает при добавлении хэштага (% 23)

    iPhone: Могу ли я сделать UIDatePicker на вершине UIKeyboard?

    Файл Cocoa / Cocoa.h не найден

    Отключить хранилище резервных копий на CAShapeLayer или подклассе CALayer, чтобы предотвратить предупреждение об ошибке «фиктивный уровень»

    Ярлык для xcode «вернуться к последнему месту» в том же файле?

    Как загрузить приложение с группами приложений в Apple Store?

    Почему буфер должен быть __unsafe_unretained на NSInvocation – getArgument: atIndex :?

    «Недопустимый путь значка» – Ошибка, полученная от Apple App Store Team

    endMatchInTurnWithMatchData: completeHandler: сбой с недопустимым состоянием

    iOS EXC_BAD_ACCESS: как отлаживать?

    Как создать округленный UITextField с внутренней тенью

    Как остановить UILabel от замены «…» символом многоточия

    Не удалось запустить приложение в Simulator: во время работы была обнаружена ошибка (Domain = LaunchServicesError, Code = 0)

    Шифрование и расшифровка iOS / Node.js Запрос на безопасность

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