Я тоже столкнулся с этой проблемой.Основная проблема заключается в том, что контроллеры popover не могут представлять модальные представления - кажется, что случай не был должным образом рассмотрен или спроектирован.В моей ситуации это было достаточно легко обойти.Я только что расширил протокол делегата для моего контроллера представления, размещенного на popover.Основное представление устанавливает себя в качестве делегата для представления popover и принимает на себя ответственность за отображение и отклонение модальных представлений, которые пользователь запрашивает из popover.
Так как у меня уже был протокол делегата для чистого отклонения popoverПосмотрите, когда пользователь нажимает «готово», это было всего лишь небольшое растяжение, чтобы заставить автоповорот работать так, как я этого хотел.Вот некоторые фрагменты:
@protocol InfoViewControllerDelegate <NSObject>
@optional
// Implement this to close the info view once the user clicks done.
- (void)infoViewDidFinish:(InfoViewController *)view;
// Implement this method if the delegate launched us as a popup view and must therefore
// take responsibility for diplaying help.
- (void)infoViewDidRequestHelp:(InfoViewController *)view;
@end
И в моем основном представлении iPad, которое представляет это всплывающее окно:
#pragma mark - InfoViewControllerDelegate methods
- (void)infoViewDidFinish:(InfoViewController *)view {
[self hideInfo:self];
}
- (void)infoViewDidRequestHelp:(InfoViewController *)view {
[self hideInfo:self]; // Close the info view first
HelpViewController *help = [[HelpViewController alloc] init];
help.delegate = self;
[self presentModalViewController:help animated:YES];
[help release];
}
Чтобы упростить жизнь для случаев, когда я запускаю представление информации за пределамивсплывающее представление (например, на iPhone, это простое модальное представление), оно проверяет, обрабатывает ли делегат модальные подпредставления, и, если нет, обрабатывает их само.Таким образом, мне вообще не нужно было менять базовый контроллер iPhone, так как автоповорот уже работал нормально.Вот действие кнопки «Справка» в контроллере информационного представления, показывающее, как я это сделал:
- (IBAction)help:(id)sender {
if ([delegate respondsToSelector:@selector(infoViewDidRequestHelp:)]) {
[delegate infoViewDidRequestHelp:self];
} else {
HelpViewController *help = [[HelpViewController alloc] init];
help.delegate = self;
[self presentModalViewController:help animated:YES];
[help release];
}
}
С этим кодом весь мой интерфейс плавно автоматически на обоих устройствах независимо от того, были ли задействованы всплывающие окна.