我有一个导致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;
相同的文件,无论何时你想解雇popover:
[popoverController dismissPopoverAnimated:YES];
我可以在按下按钮时调用最后一个功能。
我的问题是XCode在[viewController setPopoverController:[popoverSegue popoverController]]
行上给出了一个错误: ARC语义问题:选择器'setPopOverController'没有已知的类方法
我想要实施什么?
答案 0 :(得分:2)
以下是我使用的方法:
打开你的故事板文件,选择segue箭头并打开属性检查器(选项 - 命令 - 4),并使用合理的名称填写标识符,例如“myPopoverSegue”。
在源视图控制器中,在@implementation之后定义一个变量:
@implementation ViewController
{
__weak UIPopoverController *myPopover;
}
然后,再次在Source 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];
最后,每当你想要解雇popover:
[[NSNotificationCenter defaultCenter] postNotificationName:@"popoverShouldDismiss" object:nil];
希望这有帮助! 这样,您也可以在不更改代码的情况下将segue更改为其他控制器。
答案 1 :(得分:1)
您可以添加委托< UIPopoverControllerDelegate>到你的班级并覆盖委托方法:
- (BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popoverController
{
return NO;
}
当用户按下屏幕上的任何位置时,这将阻止弹出窗口被解除。 现在,您可以使用以下方法在按钮的选择器方法中关闭弹出窗口:
[popoverController dismissPopoverAnimated:YES];
答案 2 :(得分:1)
在iOS 8中,它非常简单。只需致电
[self dismissViewControllerAnimated:YES completion:^{}];
弹出窗口是常规的演示控制器,因此它或多或少与模态视图控制器完全相同。
答案 3 :(得分:0)
试试此代码
-(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];
}
}
我希望它可以帮到你。