使用 ABNewPersonViewController 时关闭 UIPopoverController

Posted

技术标签:

【中文标题】使用 ABNewPersonViewController 时关闭 UIPopoverController【英文标题】:Dismissing UIPopoverController when using ABNewPersonViewController 【发布时间】:2010-09-30 09:13:10 【问题描述】:

我有一个“添加联系人”按钮,当在 iPhone 上时,我以模态方式呈现带有 ABNewPersonController 的根视图控制器的导航控制器。

如果在 iPad 上我有一个弹出框,我可以在里面显示新的人控制器 - 很好。

问题出现在试图解雇时。

我可以在使用 didCompleteWithNewPerson 的实现中触摸完成或取消时关闭弹出框;

if(self.popoverController != nil)
    [popoverController dismissPopoverAnimated:YES];  

但是,在弹出框外触摸时,它不会关闭。

我已经为我的 popoverControllerShouldDismissPopover 方法返回 YES,并将我的 popover 的委托设置为 this。我已经在这个方法中放了一个 NSLOG,但它没有放在那里 - 我错过了什么吗?

有谁知道在触摸外部时如何关闭弹出框?

更新 - 更多代码

-(IBAction)contactsClicked:(id) sender

    ABNewPersonViewController *newPersonView = [[ABNewPersonViewController alloc] init];
    [newPersonView setNewPersonViewDelegate:self];
    [newPersonView setDisplayedPerson:newPerson];

        UINavigationController *addContactNavController = [[UINavigationController alloc] initWithRootViewController:newPersonView];
        [newPersonView release];


        if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 

            if(self.popoverController == nil)
                UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:addContactNavController];

                self.popoverController = popover;
                self.popoverController.delegate = self;
                [popover release];
            
            CGRect frame = [sender frame];
            [popoverController presentPopoverFromRect:frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionRight animated:YES];
         else 
            [self presentModalViewController:addContactNavController animated:YES];
            [addContactNavController release];
        
    
-(void)unknownPersonViewController:(ABUnknownPersonViewController *)unknownPersonView didResolveToPerson:(ABRecordRef)person
    [self dismissModalViewControllerAnimated:YES];

-(void)newPersonViewController:(ABNewPersonViewController *)newPersonViewController didCompleteWithNewPerson:(ABRecordRef)person 
    NSLog(@"DONE OR CANCEL clicked!!!!"); //prints
    if (self.popoverController != nil) 
        [popoverController dismissPopoverAnimated:YES];
    
    [self dismissModalViewControllerAnimated:YES];

新人控制器的完成和取消按钮工作,关闭控制器和弹出框(在 iPad 上运行时)。我想这意味着 ABNewPersonViewController 的委托已正确实现。 (?)

我猜我可能会因为有多个控制器而混淆了这个问题,而我的 popover 委托方法被隐藏了还是什么?

提前致谢

编辑 - 委托方法

-(BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)thePopoverController
    NSLog(@"clicked outside the popover");//never prints
    return YES;
    

【问题讨论】:

【参考方案1】:

来自文档:

在弹出窗口内的点击不会自动导致弹出窗口被关闭。您的视图和视图控制器代码必须显式处理弹出框内的操作和事件,并根据需要调用 dismissPopoverAnimated: 方法。

您应该使用 popover 委托方法 –popoverControllerShouldDismissPopover: 来监听它何时将被解除并在那里进行保存等。

另外,您应该使用self 而不是this

【讨论】:

我已经实现了 -popoverControllerShouldDismissPopover,如 OP 中所述,但控制似乎永远不会进入这里。我的意思是自我(c# 背景) 您是否将对象设置为UIPopoverControllerDelegate @nevan 是的。我想引起解雇的是弹出框之外的触摸。 您需要发布更多代码。您似乎没有正确设置委托。 该代码中没有委托方法。是否实现了–popoverControllerShouldDismissPopover:并符合UIPopoverControllerDelegate

以上是关于使用 ABNewPersonViewController 时关闭 UIPopoverController的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)