iOS:关闭使用界面生成器生成的弹出框,并在弹出框内使用按钮
Posted
技术标签:
【中文标题】iOS:关闭使用界面生成器生成的弹出框,并在弹出框内使用按钮【英文标题】:iOS: dismiss popOver generated with Interface Builder with button within the popOver 【发布时间】:2013-05-29 12:29:12 【问题描述】:我有一个通向 popOver 的按钮,所有这些都是在 Interface Builder 中创建的。当我按下它外面的某个地方时,popOver 会关闭,但我还想在 popOver 内实现一个按钮。
我找到了 Giorgio Barchiesi 可追溯到 2011 年的解决方案,但我未能实施。这是他的解决方案:
在源视图控制器的实现文件中:
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
if ([[segue destinationViewController] isKindOfClass:[MyDestViewController class]])
MyDestViewController* viewController = (MyDestViewController*)[segue destinationViewController];
UIStoryboardPopoverSegue* popoverSegue = (UIStoryboardPopoverSegue*)segue;
[viewController setPopoverController:[popoverSegue popoverController]];
在目标视图控制器的头文件中:
@property (weak, nonatomic) UIPopoverController* popoverController;
在目标视图控制器的实现文件中:
@synthesize popoverController;
相同的文件,只要你想关闭弹出框:
[popoverController dismissPopoverAnimated:YES];
按下按钮时我可以调用最后一个函数。
我的问题是 XCode 在 [viewController setPopoverController:[popoverSegue popoverController]]
行上给了我一个错误:ARC 语义问题:选择器“setPopOverController”没有已知的类方法
我错过了什么?
【问题讨论】:
【参考方案1】:这是我使用的方法:
打开你的故事板文件,选择segue箭头并打开属性检查器(Option - Command - 4)和标识符填写一个合理的名称,如“myPopoverSegue”。
在您的源视图控制器中,在 @implementation 之后定义一个变量:
@implementation ViewController
__weak UIPopoverController *myPopover;
然后,再次在源 VC 中:
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
if ([segue.identifier isEqualToString:[dict objectForKey:@"myPopoverSegue"]]) //@"segue" is your segue name. You can use isKindOfClass as you do currently, I prefer this method.
myPopover = [(UIStoryboardPopoverSegue *)segue popoverController];
-(void)closePopover
[myPopover dismissPopoverAnimated:YES];
在你的 Source VC 的 viewDidLoad 方法的最后写:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(closePopover) name:@"popoverShouldDismiss" object:nil];
最后,每当您想关闭弹出框时:
[[NSNotificationCenter defaultCenter] postNotificationName:@"popoverShouldDismiss" object:nil];
希望这会有所帮助! 这样,您还可以在不更改代码的情况下将 segue 更改为不同的控制器。
【讨论】:
【参考方案2】:您可以将委托 添加到您的类并覆盖委托方法:
- (BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popoverController
return NO;
当用户按下屏幕上的任何位置时,这将防止弹出框消失。 现在您可以使用以下方法关闭按钮选择器方法中的弹出框:
[popoverController dismissPopoverAnimated:YES];
【讨论】:
谢谢你,但我没有问当用户推到它外面时如何停止关闭popOver。相反,我问如何从 popOver 中的按钮关闭它? 你在调用类似的方法吗:[popoverControllerdismissPopoverAnimated:YES];在按钮的选择器方法如 -(IBAction) buttonPressed [popoverController dismissPopoverAnimated:YES];这不工作吗? 是的,我是。问题是 popoverController 不能仅仅关闭它自己。它需要来自它的根视图的引用,这是用户 chandan 试图解决的问题,但我一定忘记了一些东西,因为它不起作用......【参考方案3】:在 ios 8 中,这真的很容易。打个电话就行了
[self dismissViewControllerAnimated:YES completion:^];
弹出框是常规的演示控制器,因此它或多或少与模态视图控制器完全相同。
【讨论】:
这绝对是正确的方法。我以这种方式创建了一个链接到按钮的IBAction
:- (IBAction)pressedCloseButton:(id)sender [self dismissViewControllerAnimated:YES completion:nil];
【参考方案4】:
试试这个代码
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
if ([[segue destinationViewController] isKindOfClass:[MyDestViewController class]])
MyDestViewController* viewController = (MyDestViewController*)[segue destinationViewController];
UIStoryboardPopoverSegue* popoverSegue = (UIStoryboardPopoverSegue*)segue;
popoverSegue.popoverController=[[UIPopoverController alloc] initWithContentViewController:viewController];
[popoverSegue.popoverController setPopoverContentSize:CGSizeMake(viewController.view.frame.size.width, viewController.view.frame.size.height)];
popoverSegue.popoverController.delegate=self;
[viewController setPopoverController:popoverSegue.popoverController];
希望对你有帮助。
【讨论】:
感谢您的快速回复,但在我的情况下不起作用。当我尝试设置popoverSegue.popoverController=[[UIPopoverController alloc] initWithContentViewController:viewController];
方法时,我无法在那里设置我的根ViewController (意外的接口名称'ViewController'),它仍然在setPopOverController 函数上返回相同的错误。我是否必须在 .h 文件中为我的 ViewControllers 设置一个属性?以上是关于iOS:关闭使用界面生成器生成的弹出框,并在弹出框内使用按钮的主要内容,如果未能解决你的问题,请参考以下文章