1

我在关闭从 UINavigationController 的 navigationItem 启动的弹出框时遇到问题。似乎由 UINavigationController 插入的导航项不会触发 UIPopoverController 的解除。通常,当您在弹出框外点击时,它会被关闭。但是当您点击导航项时,弹出框不会被关闭。更糟糕的是,如果您点击触发弹出框的按钮,您将获得弹出框的第二个实例。

所有这些都是使用故事板完成的: - 创建一个视图,将其嵌入到 UINavigationView 中,以便在顶部获得一个 navigationItem。- 将 UIBarButtonItem 放入 navigationItem(左或右,对于导航堆栈上的初始视图无关紧要)。- 定义另一个视图,并将一个 segue 从 UIBarButtonItem 拖到此视图。- 将segue设置为popover。

弹出窗口打开后,我无法通过点击 navigationItem 将其关闭。我不敢相信这“按设计工作”,所以我怀疑我错过了一些东西。

虽然我的目标是尽可能少地编程(这就是故事板的意义所在,不是吗?),但我想到了解决方法:我想到的第一个解决方法是在 navigationItem 中添加一个 UITapGestureRecognizer,这会忽略当它检测到在 navigationItem 上的点击时弹出。不幸的是,navigationItem 似乎不是 UIVIew,所以它缺少 addGestureRecognizer: 方法...

编辑:向 self.navigationController.navigationBar 添加 UITapGesturerecognizer 是可能的,但会阻止任何点击到达导航栏上的 UIBarButtonItems。是的,我本可以预料到的。

非常感谢您的帮助,诺比

4

4 回答 4

2

这是故事板中弹出框的完整描述。假设您的控制器出现在弹出框名为MyPopupController,请执行以下操作:

  1. MyPopupController使用 style定义从主场景到场景的转场Popover
  2. 将属性添加到MyPopupController.h

    @property (weak, nonatomic) UIPopoverController *popover;
    
  3. 综合属性MyPopupController.m

    @synthesize popover = _popover
    
  4. prepareForSegue:sender:主场景控制器的方法中,设置popover属性:

    UIStoryboardPopoverSegue *ps = (UIStoryboardPopoverSegue *)segue;
    MyPopupController *dc = ps.destinationViewController;
    dc.popover = ps.popoverController;
    
  5. 在 的viewWillAppear:方法中MyPopupController,添加以下代码(也不要忘记[super viewWillAppear]):

    self.popover.passThroughViews = nil;
    

你现在应该完成了。

感谢罗伯特的基本想法 - 我只需要找到正确的位置,因为presentPopoverFromBarButtonItem在使用情节提要时不使用。请注意,将 (5) 放入viewDidLoad不起作用。

玩得开心编码!

于 2012-12-19T10:20:39.527 回答
1

https://stackoverflow.com/a/12874772/1455770

从栏按钮项目呈现弹出框后,弹出框已将其“passthroughViews”设置为包含导航栏,因此您的点击不会注册。呈现弹出框后立即将 passthroughviews 设置为 nil。IE。

self.myPopoverController presentPopoverFromBarButtonItem:myBarButtonItem permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
self.myPopoverController.passthroughViews = nil;// at this point the myPopoverController has had its pass through views set to include the whole nav bar. remove it.
于 2012-12-03T04:30:48.087 回答
0

可能有比这更好的解决方案,但为什么不只在弹出框打开时将 UITapGestureRecognizer 添加到导航栏?点击按钮打开弹出框后,将 TapGestureRecogniser 添加到导航栏。关闭弹出框后,从导航栏中删除 TapGestureRecogniser。

于 2012-07-20T11:42:43.027 回答
0

我最近遇到了这个问题,我见过的解决方案都没有为我工作。然后经过一些研究,我发现了一种像魅力一样起作用的方法。

首先,您需要将 添加UIStoryboardPopoverSegue到您的课程中。

@property (nonatomic, strong) UIStoryboardPopoverSegue *popoverSegue;

在类实现中合成它:

@synthesize popoverSegue;

然后,在按下按钮时调用的函数内部添加以下代码:

([[popoverSegue popoverController] isPopoverVisible]) ? 
            [self.popoverSegue.popoverController dismissPopoverAnimated: YES] :
            [self performSegueWithIdentifier: @"popSegue" sender:nil];

现在你几乎准备好了。在方法内部 - (void) prepareForSegue:(UIStoryboard)segue sender:(id)sender添加以下代码:

if([[segue identifier] isEqualToString:@"popSegue"]){
    self.popoverSegue = (UIStoryboardPopoverSegue*) segue;
    if(viewPopoverController == nil){
        viewController = [[UIViewController alloc] init];
        viewPopoverController = [[UIPopoverController alloc] initWithContentViewController:viewController];
    }
}

现在,每次您按下按钮时,它都会显示或关闭您的窗口,如果您在弹出框外按下,该窗口也将被关闭。我希望它可以帮助某人。

于 2013-08-01T02:27:29.453 回答