popoverControllerDidDismissPopover方法不被调用

在我的应用程序中,我有一个presentViewController ,里面有一个打开popup窗口的button。 在这个popover中,我有一个barButtonItem来保存这个popover的数据。 我希望当用户点击popover之外时,数据也可以被保存。 我试图在presentViewController视图中使用popoverControllerDidDismissPopover方法。 我有委托,但是当我在popover之外点击时,这个方法不会被调用。

我能做什么?

谢谢!!

添加这行代码,同时添加popOver:

  popover.delegate = self; 

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

 @interface yourViewController : UIViewController<UIPopoverControllerDelegate> 

你可能已经解决了,但我只是面临同样的问题。 我在我的UIPopoverController中持有一个UIPopoverController的实例, UIPopoverController以这种方式:

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

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

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

也许你正在重新初始化你的UIPopoverController – 在重新初始化之后再次设置委托。

我有同样的问题,我通过处理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]; } 

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

问题在于你的popover控制器的初始化。 如果在故事板中已经创build了popover,则需要引用此popup窗口,以便委托在被解散时被调用。

在你准备segue的方法中:

代替:

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

你需要:

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

然后确保正确处理,如果popup窗口应该出现在

  • (BOOL)应该执行SegueWithIdentifier:(NSString *)标识符发送者:(id)发送者

我遇到过同样的问题。 您将需要保留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; }