UIPopoverController以模态方式呈现在iOS 5中不起作用

首先,我们可以在这里讨论iOS 5吗? 或者它仍然在NDA下? 如果我们不能谈论它,请忽略我的问题。

通过安装iOS 5的iPad测试我的应用程序,我发现我的“模态”弹出窗口有问题:可以通过点击它来关闭它,换句话说,它不是模态的! 我不知道我做错了什么。

视图控制器使用以下代码打开popover:

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 } 

有什么遗漏?

我找到了。 setModalInPopover赋值必须位于嵌入式视图控制器的viewDidAppear方法内,以使弹出窗口为模态:

 - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [self setModalInPopover:YES]; } 

如果您使用的自定义视图控制器知道视图将在弹出框中,则批准的答案将起作用。 但是,如果您使用以编程方式创建的通用视图控制器或视图控制器,其viewDidAppear方法无法以任何原因覆盖,您还可以在类中实现UIPopoverControllerDelegate协议,将弹出UIPopoverControllerDelegate设置为该类,在popoverControllerShouldDismissPopover返回NO。

在一些实现UIPopoverControllerDelegate的类中:

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

在创建弹出控制器的代码中:

 UIPopoverController * pc = initialize and setup pc.delegate = instance of class that impleements UIPopoverControllerDelegate 

您是否尝试过设置导航控制器的modalInPopover属性? 这是视图控制器实际上由modalInPopover “拥有”,所以我希望modalInPopover使用其modalInPopover属性来确定它是否是模态的。

也许UINavigationController确实将它传递给iOS 4.x中当前可见的子视图控制器。