在我的应用程序中,我有一个presentViewController
,在其中我有一个打开弹出框的按钮。在这个弹出窗口中,我有一个 barButtonItem 来保存这个弹出窗口的数据。我希望当用户在弹出框之外点击时,也可以保存数据。我尝试在视图中使用该popoverControllerDidDismissPopover
方法。presentViewController
我有委托,但是当我在弹出框之外点击时,不会调用此方法。
我能做些什么?
谢谢!!
在我的应用程序中,我有一个presentViewController
,在其中我有一个打开弹出框的按钮。在这个弹出窗口中,我有一个 barButtonItem 来保存这个弹出窗口的数据。我希望当用户在弹出框之外点击时,也可以保存数据。我尝试在视图中使用该popoverControllerDidDismissPopover
方法。presentViewController
我有委托,但是当我在弹出框之外点击时,不会调用此方法。
我能做些什么?
谢谢!!
在添加 popOver 的同时添加这行代码:
popover.delegate = self;
还要在 .h 文件中注册 popOverDelegate,您可以在其中展示您的 popOver 控制器
@interface yourViewController : UIViewController<UIPopoverControllerDelegate>
请注意文档!
“当用户采取行动解除弹出框时调用委托。 当以编程方式解除弹出框时,不会调用此方法。 ”
这是我的情况,因为我的弹出窗口正在使用这种方法关闭按钮点击:
dismiss(animated: true, completion: nil)
您可能已经解决了它,但我刚刚遇到了同样的问题。我UIPopoverController
在我的 Viewcontroller 中持有一个实例,并以这种方式拥有它:
self.popover.delegate = self;
self.popover = [[UIPopoverController alloc] initWithContentViewController:wgtvc];
当然这不起作用,因为我正在初始化UIPopoverController
AFTER 设置委托,它会覆盖委托设置。所以正确的方法是首先初始化 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 对象,这样才能调用委托方法。它很奇怪,但它有效。
@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;
}
我知道这个问题很老,但希望它可以帮助那里的人......
问题在于您的弹出框控制器的初始化。如果您在情节提要中建立了弹出框 segue,则需要引用此弹出框,以便在解除代理时调用代理。
在您准备 segue 方法中:
代替:
self.popoverController = [[UIPopoverController alloc]initWithContentViewController:segue.destinationViewController];
self.popoverController.delegate = self;
你需要:
self.popoverController = [(UIStoryboardPopoverSegue *)segue popoverController];
self.popoverController.delegate = self;
然后确保正确处理弹出框何时出现