2

在我的应用程序中,我有一个presentViewController,在其中我有一个打开弹出框的按钮。在这个弹出窗口中,我有一个 barButtonItem 来保存这个弹出窗口的数据。我希望当用户在弹出框之外点击时,也可以保存数据。我尝试在视图中使用该popoverControllerDidDismissPopover方法。presentViewController我有委托,但是当我在弹出框之外点击时,不会调用此方法。

我能做些什么?

谢谢!!

4

6 回答 6

5

在添加 popOver 的同时添加这行代码:

 popover.delegate = self;

还要在 .h 文件中注册 popOverDelegate,您可以在其中展示您的 popOver 控制器

@interface yourViewController : UIViewController<UIPopoverControllerDelegate>
于 2012-09-04T09:35:44.893 回答
5

请注意文档!

“当用户采取行动解除弹出框时调用委托。 当以编程方式解除弹出框时,不会调用此方法。

这是我的情况,因为我的弹出窗口正在使用这种方法关闭按钮点击:

dismiss(animated: true, completion: nil)
于 2019-06-13T15:22:44.830 回答
3

您可能已经解决了它,但我刚刚遇到了同样的问题。我UIPopoverController在我的 Viewcontroller 中持有一个实例,并以这种方式拥有它:

self.popover.delegate = self;
self.popover = [[UIPopoverController alloc] initWithContentViewController:wgtvc];

当然这不起作用,因为我正在初始化UIPopoverControllerAFTER 设置委托,它会覆盖委托设置。所以正确的方法是首先初始化 UIPopovercontroller 然后设置委托

self.popover = [[UIPopoverController alloc] initWithContentViewController:wgtvc];
self.popover.delegate = self;

也许您正在重新初始化您的UIPopoverController某个地方 - 只需在重新初始化后再次设置委托。

于 2013-04-04T13:18:48.303 回答
2

我有同样的问题,我通过对 iOS8 进行不同的处理来解决它。

演示代码

    UIViewController *searchViewController = [[UIViewController alloc] init];

    [[searchViewController view] addSubview:_searchOptions];
    [searchViewController setModalPresentationStyle:UIModalPresentationPopover];
    [searchViewController setPreferredContentSize:CGSizeMake(500, 400)];

    [_searchOptions setHidden:NO];
    [_searchOptions setFrame:[[searchViewController view] bounds]];
    [_searchOptions setAutoresizingMask:UIViewAutoresizingFlexibleWidthAndHeight];

    if (CRIdiomToolsIsIOS8OrHigher())
    {
        UIPopoverPresentationController *popOverPresentationController = [searchViewController popoverPresentationController];

        [popOverPresentationController setDelegate:self];
        [popOverPresentationController setSourceView:[_searchOptionsButton disclosureView]];
        [popOverPresentationController setSourceRect:[[_searchOptionsButton disclosureView] bounds]];

        [self presentViewController:searchViewController animated:YES completion:nil];
    }
    else
    {
        UIPopoverController *popOverControler = [[UIPopoverController alloc] initWithContentViewController:searchViewController];

        [popOverControler setDelegate:self];
        [popOverControler setPopoverContentSize:CGSizeMake(500, 400)];

        [popOverControler presentPopoverFromRect:[[_searchOptionsButton disclosureView] bounds] inView:[_searchOptionsButton disclosureView] permittedArrowDirections:UIPopoverArrowDirectionUp|UIPopoverArrowDirectionLeft animated:YES];
    }

代表电话

#pragma mark Delegate Methods: UIPopoverControllerDelegate

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
{
    [self showSearchOptions:NO animated:YES];
}

#pragma mark Delegate Methods: UIPopoverPresentationControllerDelegate

- (void)popoverPresentationControllerDidDismissPopover:(UIPopoverPresentationController *)popoverPresentationController
{
    [self showSearchOptions:NO animated:YES];
}
于 2015-01-12T10:36:22.133 回答
2

我遇到过同样的问题。您将需要保留 popover 对象,这样才能调用委托方法。它很奇怪,但它有效。

@property (nonatomic, retain) UIPopoverController *popupObject;

UIPopoverController *popup = [[UIPopoverController alloc] initWithContentViewController:viewController];
popup.delegate = self;
[popup presentPopoverFromRect:presentationRect inView:self permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
self.popupObject = popup; //Retained


-(void) popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
{
  //Do whatever operation you need to perform
  self.popupObject = nil; 
}
于 2016-05-03T13:42:38.530 回答
1

我知道这个问题很老,但希望它可以帮助那里的人......

问题在于您的弹出框控制器的初始化。如果您在情节提要中建立了弹出框 segue,则需要引用此弹出框,以便在解除代理时调用代理。

在您准备 segue 方法中:

代替:

    self.popoverController = [[UIPopoverController alloc]initWithContentViewController:segue.destinationViewController];
    self.popoverController.delegate = self;

你需要:

   self.popoverController = [(UIStoryboardPopoverSegue *)segue popoverController];
    self.popoverController.delegate = self;

然后确保正确处理弹出框何时出现

  • (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender
于 2013-08-28T15:03:03.530 回答