popoverControllerDidDismissPopover method is not called

二次信任 提交于 2019-12-06 10:21:11

Add this line of code while adding popOver:

 popover.delegate = self;

Also register popOverDelegate in .h file where u present your popOver COntroller

@interface yourViewController : UIViewController<UIPopoverControllerDelegate>

You probably already solved it, but I just faced the same problem. I'm holding a instance of UIPopoverController in my Viewcontroller and had it this way:

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

of course this doesn't work because I'm initializing the UIPopoverController AFTER setting the delegate, which overrides the delegate setting. So the correct way is to FIRST initialize the UIPopovercontroller and THEN setting the delegate

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

Maybe you are reinitializing your UIPopoverController somewhere - just set the delegate again after reinitializing.

I had the same problem and I solved it by handling it different for iOS8.

Presentation code

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

Delegate calls

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

I had the same issue. You will need to retain the popover object, that way the delegate method gets called. Its strange but it works.

@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; 
}

I know this questions is old but hopefully it helps someone out there...

The issue is in the initialization of your popover controller. If you have established the popover segue in the storyboard you need to have a reference to this popover in order for the delegate to be called when it is dismissed.

In your prepare for segue method:

Instead of:

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

You need:

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

Then make sure to correctly handle if the when the popover should appear in

  • (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender

Please, pay attention to docs!

"Called on the delegate when the user has taken action to dismiss the popover. This is not called when the popover is dismissed programmatically."

It was my case because my popover was closing on button tap with this method:

dismiss(animated: true, completion: nil)
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!