【问题标题】:UIPopoverController presented modally doesn't work in iOS 5以模态方式呈现的 UIPopoverController 在 iOS 5 中不起作用
【发布时间】:2011-10-18 12:09:49
【问题描述】:

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

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

视图控制器使用以下代码打开弹出框:

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
}

有什么遗漏吗?

【问题讨论】:

    标签: ios ipad uipopovercontroller ios5 ipad-2


    【解决方案1】:

    我找到了。 setModalInPopover 赋值必须在嵌入式视图控制器的 viewDidAppear 方法内,才能使弹出框成为模态:

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

    【讨论】:

    • 对我来说似乎是一个错误。我需要将[self setModalInPopover:[self isModalInPopover]]; 放在 viewDidAppear 方法中,因为我在创建视图控制器的代码中从外部设置此值。
    【解决方案2】:

    如果您使用的自定义视图控制器知道视图将在弹出窗口中显示,则批准的答案将起作用。但是,如果您使用的是以编程方式创建的通用视图控制器或视图控制器的 viewDidAppear 方法,无论出于何种原因您都无法覆盖,您也可以在类中实现 UIPopoverControllerDelegate 协议,设置弹出框委托到那个班级并在popoverControllerShouldDismissPopover中返回NO。

    例子

    在一些实现 UIPopoverControllerDelegate 的类中:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 你是对的,如果我设置导航控制器的 modalInPopover 属性,它应该可以工作。但它不是那样工作的。不过,我找到了解决方案。我会尽快发布它,它可能会帮助其他人。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-15
      • 2011-04-09
      • 1970-01-01
      • 1970-01-01
      • 2014-05-02
      • 2015-07-28
      相关资源
      最近更新 更多