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