UIPopoverController, представленный модально, не работает в iOS 5 - PullRequest
2 голосов
/ 18 октября 2011

Прежде всего, мы можем поговорить об iOS 5 здесь?Или это все еще под NDA?Если мы не можем говорить об этом, просто проигнорируйте мой вопрос.

При тестировании моего приложения с iPad с установленной iOS 5 я обнаружил проблему с моим «модальным» поповером: это можно закрыть, нажав внеэто, другими словами, это не модально!Я понятия не имею, что я делаю неправильно.

Контроллер представления открывает поповер с этим кодом:

AddProjectViewController *addProjectViewController = [[AddProjectViewController alloc] initWithStyle:UITableViewStyleGrouped];
[addProjectViewController setDelegate:self];

UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:addProjectViewController];
[addProjectViewController release];

CGRect popoverFrame = [sender frame];

UIPopoverController *tempPopover = [[UIPopoverController alloc] initWithContentViewController:navController];
[tempPopover presentPopoverFromRect:popoverFrame inView:[self view] permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
self.currentPopover = tempPopover;
[tempPopover release];
[navController release];

Контроллер представления, который находится внутри поповера, имеет эту строку в своем viewDidLoad.

- (void)viewDidLoad
{
    [self setModalInPopover:YES];

    // Do other stuff
}

Чего не хватает?

Ответы [ 3 ]

10 голосов
/ 19 октября 2011

Я нашел это.Назначение setModalInPopover должно быть внутри метода viewDidAppear встроенного контроллера представления, чтобы всплывающее окно было модальным:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    [self setModalInPopover:YES];
}
1 голос
/ 18 ноября 2011

Одобренный ответ будет работать, если вы используете пользовательский контроллер представления, который знает, что представление будет во всплывающем окне. Однако, если вы используете универсальный контроллер представления, созданный программно, или контроллер представления, метод которого viewDidAppear которого у вас нет возможности переопределить по любой причине, вы также можете реализовать протокол UIPopoverControllerDelegate в классе, установите делегат popover в этот класс и вернуть NO, в popoverControllerShouldDismissPopover.

Пример

В некотором классе, который реализует UIPopoverControllerDelegate:

- (BOOL) popoverControllerShouldDismissPopover:(UIPopoverController *) popoverController {
    return NO;
}

В коде, который создает ваш поповер контроллер:

UIPopoverController * pc = initialize and setup 

pc.delegate = instance of class that impleements UIPopoverControllerDelegate
0 голосов
/ 18 октября 2011

Вы пытались установить свойство modalInPopover контроллера навигации? Это контроллер представления, который на самом деле «принадлежит» popover, поэтому я ожидаю, что popover использует его свойство modalInPopover для определения, является ли он модальным или нет.

Возможно, UINavigationController передал это своему видимому в настоящее время дочернему контроллеру представления в iOS 4.x.

...