Сбой SplitViewController в портретном режиме (ipad)


У меня есть приложение с вкладками, которое содержит пять splitviewcontrollers.

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

Ошибка утверждения в -[_UISlidingPopoverLayoutInfo _popoverViewSizeForContentSize: arrowDirection:], /SourceCache/UIKit_Sim/UIKit-1914.84/_UIPopoverLayoutInfo.М: 160 2012-04-24 19: 15: 38.674 SMToolkit[12420:11303] * Завершение работы приложения из-за неперехваченного исключения 'NSInternalInconsistencyException', причина: 'неизвестное направление передано в _popoverViewSizeForContentSize: arrowDirection:'

Дело в том, что пять видов вырезаны-N-вставлены из одного и того же источника, в значительной степени шаблонного Apple. Я на самом деле не раскадровываю поповеры, и у меня нет их в методе prepareforsegue, так как spliltviewcontroller теоретически дает их мне ' для свободный "

Все пять splitviewcontrollers соответствуют UISplitViewControllerDelegate

Appdelgate выглядит так:

    UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController;
   //Person
    UISplitViewController *personSplitViewController = [tabBarController.viewControllers objectAtIndex:1];
    UINavigationController *personNavigationController = [personSplitViewController.viewControllers lastObject];
    personSplitViewController.delegate = (id)personNavigationController.topViewController;
    UINavigationController *personMasterNavigationController = [personSplitViewController.viewControllers objectAtIndex:0];
    PersonMasterViewController *personController = (PersonMasterViewController *)personMasterNavigationController.topViewController;
    personController.managedObjectContext = self.managedObjectContext;
    //Scene
    UISplitViewController *sceneSplitViewController = [tabBarController.viewControllers objectAtIndex:2];
    UINavigationController *sceneNavigationController = [sceneSplitViewController.viewControllers lastObject];
    sceneSplitViewController.delegate = (id)sceneNavigationController.topViewController;
    UINavigationController *sceneMasterNavigationController = [sceneSplitViewController.viewControllers objectAtIndex:0];
    SceneMasterViewController *sceneController = (SceneMasterViewController *)sceneMasterNavigationController.topViewController;
    sceneController.managedObjectContext = self.managedObjectContext;

И так далее, подставляя правильный индекс в tabBarController

Затем в контроллерах детального вида каждый имеет следующее (идентично, я проверил):

- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)popoverController
{
barButtonItem.title = NSLocalizedString(@"Master", @"Master");
[self.navigationItem setLeftBarButtonItem:barButtonItem animated:YES];
self.masterPopoverController = popoverController;
}


- (void)splitViewController:(UISplitViewController *)splitController willShowViewController:(UIViewController *)viewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem
{
// Called when the view is shown again in the split view, invalidating the button and popover controller.
[self.navigationItem setLeftBarButtonItem:nil animated:YES];
self.masterPopoverController = nil;
}

В приведенном выше примере "человек" ведет себя так, как и ожидалось, но "сцена" вызывает сбой.

Я не вижу нигде ни в одном из взглядов ничего, что говорит о том, что происходит, когда это происходит. barbuttonitem щелкается, и он не появляется в раскадровке.

Идеи?

3 4

3 ответа:

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

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

Ошибка немного загадочная. Я получил ту же ошибку, когда случайно звонил [UIPopoverController presentPopoverFromBarButtonItem: permittedArrowDirections:] два раза подряд, и второй вызов происходит, когда поповер визуализируется / анимируется.

Ошибка отказа утверждения приходит только тогда, когда nil возвращается любым методом. Поэтому я хотел бы предложить вам установить self для всех переменных и проверить на ноль..