我创建了一个弹出窗口UIBarButtonItem
使用 Xcode Storyboards(因此没有代码),如下所示:
呈现弹出窗口效果很好。但是,我无法让弹出窗口消失当我点击UIBarButtonItem
这让它出现了。
当按下按钮(第一次)时,会出现弹出窗口。当再次按下按钮(第二次)时,相同的弹出窗口会出现在其顶部,所以现在我有两个弹出窗口(如果继续按下按钮,则会有更多弹出窗口)。根据iOS 人机界面指南 http://developer.apple.com/library/ios/documentation/userexperience/conceptual/mobilehig/UIElementGuidelines/UIElementGuidelines.html#//apple_ref/doc/uid/TP40006556-CH13-SW40我需要使弹出窗口在第一次点击时出现并在第二次点击时消失:
确保屏幕上一次只能看到一个弹出窗口。您不应同时显示多个弹出窗口(或设计为外观和行为类似于弹出窗口的自定义视图)。特别是,您应该避免同时显示级联或层次结构的弹出窗口,其中一个弹出窗口从另一个弹出窗口中出现。
当用户点击时如何关闭弹出窗口UIBarButtonItem
第二次?
EDIT:这些问题似乎从 iOS 7.1 / Xcode 5.1.1 开始得到修复。 (可能更早,因为我无法测试所有版本。肯定是在 iOS 7.0 之后,因为我测试了那个版本。)当您从UIBarButtonItem
,segue 确保再次点击弹出框会隐藏弹出框而不是显示重复项。它适用于新的UIPresentationController
Xcode 6 也为 iOS 8 创建了基于 -based 的弹出窗口。
由于我的解决方案对于那些仍然支持早期 iOS 版本的人来说可能具有历史意义,因此我将其保留在下面。
如果您存储对 segue 的弹出窗口控制器的引用,请在重复调用时将其设置为新值之前将其关闭prepareForSegue:sender:
,您所避免的只是重复按下按钮时获得多个堆叠弹出框的问题 - 您仍然无法按照 HIG 的建议使用按钮来关闭弹出框(如 Apple 的应用程序等中所示)
不过,您可以利用 ARC 归零弱引用来实现简单的解决方案:
1:从按钮继续
从 iOS 5 开始,你无法通过从UIBarButtonItem
,但在 iOS 6 及更高版本上可以。 (在 iOS 5 上,您必须从视图控制器本身分离,然后调用按钮的操作performSegueWithIdentifier:
检查弹出窗口后。)
2:使用对弹出窗口的引用-shouldPerformSegue...
@interface ViewController
@property (weak) UIPopoverController *myPopover;
@end
@implementation ViewController
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// if you have multiple segues, check segue.identifier
self.myPopover = [(UIStoryboardPopoverSegue *)segue popoverController];
}
- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender {
if (self.myPopover) {
[self.myPopover dismissPopoverAnimated:YES];
return NO;
} else {
return YES;
}
}
@end
3:没有第三步!
在这里使用归零弱引用的好处是,一旦弹出窗口控制器被解除——无论是以编程方式shouldPerformSegueWithIdentifier:
,或者由用户点击弹出窗口之外的其他地方自动 - ivar 转到nil
再次,我们又回到了最初的状态。
如果不将弱引用归零,我们还必须:
- set
myPopover = nil
当驳回它时shouldPerformSegueWithIdentifier:
, and
- 将自己设置为弹出窗口控制器委托以捕获
popoverControllerDidDismissPopover:
并且还设置了myPopover = nil
在那里(所以我们可以在弹出窗口自动关闭时捕获)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)