我在关闭从 UINavigationController 的 navigationItem 启动的弹出窗口时遇到问题。看来由 UINavigationController 插入的导航项不会触发 UIPopoverController 的解除。通常,当您点击弹出窗口外部时,它会被关闭。但是,当您点击导航项时,弹出窗口不会消失。更糟糕的是,如果您点击触发弹出窗口的按钮,您将获得弹出窗口的第二个实例。
所有这些都是使用故事板完成的:
- 创建一个视图,将其嵌入到 UINavigationView 中,以便它在顶部获得一个 navigationItem。
- 将 UIBarButtonItem 放入 navigationItem(左或右,对于导航堆栈上的初始视图无关紧要)。
- 定义另一个视图,并将 Segue 从 UIBarButtonItem 拖动到该视图。
- 将segue设置为popover。
弹出窗口打开后,我无法通过点击导航项将其关闭。我不敢相信这“按设计工作”,所以我怀疑我错过了一些东西。
虽然我的目标是尽可能少地编程(这就是故事板的意义,不是吗?),但我想到了解决方法:我想到的第一个解决方法是向 navigationItem 添加 UITapGestureRecognizer,这将消除当它检测到对导航项的点击时弹出。不幸的是,navigationItem似乎不是UIVIew,因此它缺少addGestureRecognizer:方法...
编辑:将 UITapGesturerecognizer 添加到 self.navigationController.navigationBar 是可能的,但会阻止任何点击到达导航栏上的 UIBarButtonItems。是的,我本可以预料到这一点。
非常感谢您的帮助,
野比
以下是故事板中弹出窗口的完整描述。假设出现在弹出窗口中的控制器名为MyPopupController
, 做这个:
- 定义从主场景到主场景的 Segue
MyPopupController
场景、使用风格Popover
.
-
添加属性到MyPopupController.h
@property (weak, nonatomic) UIPopoverController *popover;
-
综合属性MyPopupController.m
@synthesize popover = _popover
-
In the prepareForSegue:sender:
主场景控制器的方法,设置popover
财产:
UIStoryboardPopoverSegue *ps = (UIStoryboardPopoverSegue *)segue;
MyPopupController *dc = ps.destinationViewController;
dc.popover = ps.popoverController;
-
In the viewWillAppear:
的方法MyPopupController
,添加以下代码(不要忘记[super viewWillAppear]
以及):
self.popover.passThroughViews = nil;
你现在应该完成了。
感谢罗伯特的基本想法 - 我只需要找到正确的地方,因为presentPopoverFromBarButtonItem
使用故事板时不使用。请注意,将 (5) 代入viewDidLoad
不起作用。
祝你编码愉快!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)