Я превращаю приложение для iPhone в универсальное приложение, и преобразование вложенных таблиц в схему UISplitViewController было в основном простым, но у меня осталась проблема при работе на iPad, который вызывает у меня головную боль.
Для универсальной совместимости приложений в «главном» представлении содержится UINavigationController, который используется для навигации по серии табличных представлений, каждое из которых отображает меню.Это работает нормально.
В конце концов, пользователь получает контент, отображаемый в подробном представлении.Каждая цепочка подробных представлений содержится в UINavigationController, поскольку некоторые представления могут выполнять детализацию для отображения карт и т. Д. Идея состоит в том, что всплывающая кнопка будет жить на корневом уровне подробного представления.Вероятно, важно отметить, что подробные виды создаются с нуля каждый раз, когда выбирается эта строка.
Я изучил многоэкранное представление Apple Пример кода , поэтому использую основной вид какделегат UISplitViewController, который предоставляет селекторы всплывающих окон скрытия / показа, а затем передает вызовы в любой выбранный вид подробного замещения.
При работе в ландшафтном режиме я могу выбирать разные строки в главном представлении идетализация переключается хорошо - все отлично работаетЭто замечательно.
В портретном режиме все работает не так хорошо ... поповерная кнопка корректно отображается в выбранном в данный момент подробном виде при повороте в портретную, но затем исчезает при выборе строки (т.е.как-то неправильно добавляется в NavBar вновь выбранного представления).
Я добавил диагностический код, и похоже, что выполняются правильные вызовы (с правильными указателями), чтобы отобразить кнопку всплывающего окна на новомвыбранный подробный вид.Кроме того, я могу повернуть в горизонтальное и обратное положение, после чего появляется кнопка всплывающего окна, поэтому я вполне удовлетворен тем, что popover UIBarButtonItem правильно подключен к новой детализации NavBar.
Поскольку подробные виды не отображаютсяСозданный до тех пор, пока не будет выбрана строка, мне было интересно, был ли это случай, когда UINavigationBar не был создан во время вызова showRootPopoverButtonItem (на основе примера кода Apple).Эта теория подтверждается тем фактом, что всплывающая кнопка появляется, если я поворачиваюсь в горизонтальную и обратно (как упоминалось выше) с тем же выбранным видом.
Я также вижу этот комментарий в примере кода Apple, в didSelectRowAtIndexPath,и непосредственно перед переключением подробных видов обратите внимание на использование слова 'after' ...
// Configure the new view controller's popover button (after the view has been displayed and its toolbar/navigation bar has been created).
Итак, я попытался снова вызвать метод showRootPopoverButton в viewWillAppear (к этому времени должен существовать UINavigationBar),но это не приводит к тому, что всплывающая кнопка также появляется.
Буду признателен за любые мысли и предложения относительно того, как заставить всплывающую кнопку появляться сразу, когда новая строка выбирается из основного вида, когда впортретный режим.Спасибо.
Спасибо за прочтение, соответствующий код приведен ниже.
В главном окне представлены селекторы UISplitViewControllerDelegate,
- (void)splitViewController:(UISplitViewController*)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem*)barButtonItem forPopoverController:(UIPopoverController*)pc
{
// Keep references to the popover controller and the popover button, and tell the detail view controller to show the button.
barButtonItem.title = @"Root View Controller";
self.popoverController = pc;
self.rootPopoverButtonItem = barButtonItem;
//UIViewController <SubstitutableDetailViewController> *detailViewController = [self.splitViewController.viewControllers objectAtIndex:1];
// ^ Apple's example, commented out, my equivalent code to obtain
// active detail navigation controller below,
UINavigationController *detailNavController = [self.splitViewController.viewControllers objectAtIndex:1];
UIViewController *detailViewController = detailNavController.visibleViewController;
[detailViewController showRootPopoverButtonItem:rootPopoverButtonItem];
}
- (void)splitViewController:(UISplitViewController*)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem
{
// Nil out references to the popover controller and the popover button, and tell the detail view controller to hide the button.
UINavigationController *detailNavController = [self.splitViewController.viewControllers objectAtIndex:1];
UIViewController *detailViewController = detailNavController.visibleViewController;
[detailViewController invalidateRootPopoverButtonItem:rootPopoverButtonItem];
self.popoverController = nil;
self.rootPopoverButtonItem = nil;
}
И, оченькак в примере с Apple, вот что происходит, когда в основной таблице выбирается строка,
if (rootPopoverButtonItem != nil)
{
NSLog (@"show popover button");
[newDetailViewController showRootPopoverButtonItem:self.rootPopoverButtonItem];
}
В подробном представлении
- (void)showRootPopoverButtonItem:(UIBarButtonItem *)barButtonItem
{
NSLog (@"detailViewController (view: %p, button: %p, nav: %p): showRootPopoverButton", self, barButtonItem, self.navigationItem);
barButtonItem.title = self.navigationItem.title;
[self.navigationItem setLeftBarButtonItem:barButtonItem animated:NO];
popoverButton = barButtonItem;
}
- (void)invalidateRootPopoverButtonItem:(UIBarButtonItem *)barButtonItem
{
NSLog (@"detailViewController (%p): invalidateRootPopoverButton", self);
// Called when the view is shown again in the split view, invalidating the button and popover controller.
[self.navigationItem setLeftBarButtonItem:nil animated:NO];
popoverButton = nil;
}