不调用popoverControllerDidDismissPopover方法

时间:2012-09-04 09:29:13

标签: ios uipopovercontroller

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

我该怎么办?

谢谢!

6 个答案:

答案 0 :(得分:5)

添加popOver时添加以下代码:

 popover.delegate = self;

还要在.h文件中注册popOverDelegate,其中提示你的popOver COntroller

@interface yourViewController : UIViewController<UIPopoverControllerDelegate>

答案 1 :(得分:3)

你可能已经解决了,但我遇到了同样的问题。我在我的Viewcontroller中持有UIPopoverController的实例,并且这样做了:

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

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

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

也许您正在重新初始化您的UIPopoverController - 重新初始化后再次设置代理。

答案 2 :(得分:3)

我有同样的问题。您将需要保留popover对象,这样就可以调用委托方法。它奇怪,但它的工作原理。

function projectImageAttr(imageID) {
    console.log(imageID);
    $("#dialog").dialog({
        width: 900,
        show: {
            effect: "blind",
            duration: 1000
        },
        hide: {
            effect: "explode",
            duration: 1000
        },
        resizable: "auto",
        modal: true
    });
}

答案 3 :(得分: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];
}

答案 4 :(得分:1)

我知道这些问题已经过时了,但希望它可以帮助那些人...

问题在于弹出控制器的初始化。如果您已在故事板中建立了popover 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

答案 5 :(得分:0)

请注意文档!

”当用户已采取措施消除弹出窗口时,在委托上调用。 以编程方式关闭弹出窗口时不会调用此函数。

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

dismiss(animated: true, completion: nil)