3

我有一个通向 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 Semantic Issue: No known class method for selector 'setPopOverController'

我错过了什么?

4

4 回答 4

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];

最后,每当您想关闭弹出框时:

 [[NSNotificationCenter defaultCenter] postNotificationName:@"popoverShouldDismiss" object:nil];

希望这可以帮助!这样,您还可以在不更改代码的情况下将 segue 更改为不同的控制器。

于 2013-10-12T15:10:19.747 回答
1

您可以将委托 < UIPopoverControllerDelegate > 添加到您的类并覆盖委托方法:

 - (BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popoverController
 {
     return NO;
 }

当用户按下屏幕上的任何位置时,这将防止弹出框被关闭。现在,您可以使用以下方法在按钮的选择器方法中关闭弹出框:

  [popoverController dismissPopoverAnimated:YES];
于 2013-05-29T12:39:39.370 回答
1

在 iOS 8 中,这真的很容易。打电话

[self dismissViewControllerAnimated:YES completion:^{}];

弹出框是常规的演示控制器,因此它或多或少与模态视图控制器完全相同。

于 2015-07-14T17:29:24.890 回答
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];
    }
}

我希望它对你有帮助。

于 2013-05-29T12:42:53.957 回答