2014-12-26 3 views
3

Я получаю следующий сбой, когда открываю popover, нажимая на элемент кнопки на главном контроллере, а затем поворачивая представление.«UIPopoverPresentationController presentationTransitionWillBegin» сбой при использовании UIPopoverController

"NSGenericException: UIPopoverPresentationController should have a non-nil sourceView or barButtonItem set before the presentation occurs." 

Я смотрел на подобной аварии здесь - UIActivityViewController crashing on iOS8 iPads, но я не непосредственно с помощью «UIPopoverPresentationController» где-нибудь в моем коде.

Мой главный контроллер - UIViewController и имеет barbuttonitem, который при нажатии открывает popover как другой контроллер, который является UITableViewController (DisplayTableViewController class). Ниже приведен код:

В моем основном контроллере в пользовательском методе сказать «createPopover» У меня есть:

- (void)createPopover 
{ 
     self.tableViewController = [[DisplayTableViewController alloc] init]; 
     self.tableViewController.someDelegate = self; 

     UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:self.tableViewController]; 

     // Display the popover. 
     self.navBarButtonItemPopoverController = [[UIPopoverController alloc] initWithContentViewController:navigationController]; 
     self.navBarButtonItemPopoverController.delegate = self; 

     [self displayPopover:self.myBarButton]; 
} 

- (void)displayPopover:(id)sender 
{  
     [self.navBarButtonItemPopoverController presentPopoverFromBarButtonItem:sender 
                permittedArrowDirections:UIPopoverArrowDirectionAny 
                    animated:YES]; 
} 

Когда я повернуть изображение этого запускается на выполнение. Этот код также в моем главном контроллере:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation 
{ 
    [super didRotateFromInterfaceOrientation:fromInterfaceOrientation]; 

    if ([self.navBarButtonItemPopoverController isPopoverVisible]) 
    { 
     [self.navBarButtonItemPopoverController dismissPopoverAnimated:NO]; 

     [self performSelector:@selector(displayPopover:) withObject:self.myBarButton afterDelay:0.0]; 
    } 
} 

После этого приложение падает с указанной ошибкой. В моем методе createPopover я попытался:

self.tableViewController.popoverPresentationController.sourceView = [self view]; 

Но ничего не помогает. Когда я распечатываю «self.tableViewController.popoverPresentationController» или «self.popoverPresentationController» в любое время в жизненном цикле, он всегда равен нулю. Также я заметил, что «отправитель» в методе displayPopover всегда присутствует, т.е. перед вращением и после поворота тоже и является одним и тем же объектом.

Любая идея, почему popoverPresentationController - это нуль или почему приложение рушится?

ответ

3

Это проблема с iOS8. Как вы знаете, -didRotateFromInterfaceOrientation: устарел в iOS8. Попробуйте новый API -viewWillTransitionToSize:withTransitionCoordinator:. Просто его реализация решит вашу проблему.

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id <UIViewControllerTransitionCoordinator>)coordinator 
{ 
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; 
    // we have nothing to do. 
} 
+0

О, отлично. Это действительно помогло решить проблему. Но любая идея, почему он жаловался на sourceView и barButtonItem. Из всего, что я узнал, казалось, что sourceType или barButtonItem не устанавливаются, и поэтому он сбой. –