UISplitViewController: как представить поповер? - PullRequest
4 голосов
/ 08 января 2012

У меня есть UISplitViewController, то есть UISplitViewControllerDelegate со следующим методом делегата:

splitViewController: willHideViewController: withBarButtonItem: forPopoverController:

КогдаiPad запущен в Portrait, я бы хотел, чтобы Popover из SplitView был виден.Как я могу это сделать?

Я пробовал следующий код:

- (void)splitViewController:(UISplitViewController *)svc
     willHideViewController:(UIViewController *)aViewController
          withBarButtonItem:(UIBarButtonItem *)barButtonItem
       forPopoverController:(UIPopoverController *)pc
{
    //setting the barButtonItem in the toolbar in the detail view.

    [pc presentPopoverFromBarButtonItem:barButtonItem permittedArrowDirections:UIPopoverArrowDirectionAny animated:NO];
}

Но приведенный выше код дает мне следующую ошибку:

Завершение приложенияиз-за неперехваченного исключения NSInvalidArgumentException, причина: '- [UIPopoverController presentPopoverFromRect: inView: allowArrowDirections: animated:]: всплывающие окна не могут быть представлены из представления, у которого нет окна.'

1 Ответ

4 голосов
/ 08 января 2012

есть только одна проблема, неправильное место для вызова метода presentPopover, splitViewController: * WillHide * ViewController ....... так, barButtonItem существует, но отсутствует на экране. Я использовал следующий код, и он работал для меня. Для обработки всех случаев вам нужно использовать 2 метода.

- (void)viewDidAppear:(BOOL)animated
{
    if ([[UIDevice currentDevice] orientation] == UIDeviceOrientationPortrait || [[UIDevice currentDevice] orientation] == UIDeviceOrientationPortraitUpsideDown) {
        if (self.view.window != nil) {
            [_masterPopoverController presentPopoverFromRect:CGRectMake(0, 0, 1, 1) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:NO];
        }
    }
    [super viewDidAppear:animated];
}

и

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    if (fromInterfaceOrientation == UIDeviceOrientationLandscapeLeft || fromInterfaceOrientation == UIDeviceOrientationLandscapeRight) {
        if (self.view.window != nil) {
            [_masterPopoverController presentPopoverFromRect:CGRectMake(0, 0, 1, 1) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:NO];
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...