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

时间:2011-10-18 12:09:49

标签: ios ipad uipopovercontroller ios5 ipad-2

首先,我们可以在这谈谈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];

popover内部的视图控制器在viewDidLoad中有这一行。

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

    // Do other stuff
}

有什么遗漏?

3 个答案:

答案 0 :(得分:10)

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

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

    [self setModalInPopover:YES];
}

答案 1 :(得分:1)

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

中返回NO

实施例

在一些实现UIPopoverControllerDelegate的类中:

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

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

UIPopoverController * pc = initialize and setup 

pc.delegate = instance of class that impleements UIPopoverControllerDelegate

答案 2 :(得分:0)

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

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