如何正确关闭 UIPopover?

Posted

技术标签:

【中文标题】如何正确关闭 UIPopover?【英文标题】:How to dismiss a UIPopover correctly? 【发布时间】:2011-02-21 21:04:58 【问题描述】:

当用户触摸 rightbarbuttonitem 时,我已将 UIPopover 添加到我的导航栏。 我想知道显示和消除弹出框的最干净的编码是什么。使用下面的代码,它可以工作,但不正确。 如果用户先触摸 rightbarbuttonitem,弹出框就会出现。现在他可以选择一个单元格,.. 作品。或者您可以触摸弹出框外部,它会消失。两种方式都正确。

但是当触摸 rightbarbuttonitem 之后,再次触摸该图标时,您必须触摸它两次才能再次弹出该弹出框。 (不是第一次接触)。

正确的函数应该是什么样子的?谢谢你的时间..

 -(void) downloads:(UIBarButtonItem*)button
        NSLog(@"downloads");
        if(tableViewController == nil) 
        tableViewController = [[[TableViewController alloc] initWithStyle:UITableViewStylePlain] autorelease];

        self.popoverController = [[[UIPopoverController alloc] initWithContentViewController:tableViewController]autorelease] ;
        [self.popoverController presentPopoverFromBarButtonItem:barButtonItem permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
        tableViewController.delegate = self;
        else 
            [self.popoverController dismissPopoverAnimated:NO];
            tableViewController.delegate = nil;
            tableViewController = nil;
            //[self.popoverController release];
            //self.popoverController = nil;
        
    

    //delegate
    -(void) selectedTable:(NSString*)text
        NSLog(@"selectedTable: %@", text);
         [self.popoverController dismissPopoverAnimated:YES];
    

【问题讨论】:

【参考方案1】:

评论

您的downloads: 方法检查tableViewController 值并决定是否应显示或关闭 UIPopoverController。但是您的 selectedTable: 方法确实关闭了 popoverController 并且没有将 tableViewController 设置为 nil 因此它无法按您的预期工作。

我也没有看到UIPopoverControllerDelegate 的实现,尤其是popoverControllerDidDismissPopover:,它会告诉你UIPopoverController 何时被解除(例如,通过触摸你的UIPopoverController 外部)。

内存管理

阅读内存管理指南。 [self.popoverController release]self.popoverController = nil 导致崩溃 - 在设置为零期间一个释放和第二个释放。 (我假设您的 popoverController 属性保留)。

【讨论】:

【参考方案2】:

@Chiefly Izzy:感谢您的帮助。你为我指明了正确的方向。 这是我正在使用的代码。它工作得很好。希望内存管理也很干净。不是吗?

-(void) downloads:(UIBarButtonItem*)button

    if([self.popoverController isPopoverVisible])
       
        [self.popoverController dismissPopoverAnimated:YES];
        [self.popoverController.delegate popoverControllerDidDismissPopover:self.popoverController];
        return;
    

    // PopOver Bookmarks-Icon
    if(tableViewController == nil) 

        tableViewController = [[PdfTableViewController alloc] initWithStyle:UITableViewStylePlain]; //autorelease];

        self.popoverController = [[UIPopoverController alloc] initWithContentViewController:tableViewController]; //autorelease] ;
        [self.popoverController presentPopoverFromBarButtonItem:barButtonItem permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];

        popoverController.delegate = self;
        tableViewController.delegate = self;
    
    /* Using "isPopoverVisible" from top or that else. both works
     else 
        [self.popoverController dismissPopoverAnimated:YES];
        [self.popoverController.delegate popoverControllerDidDismissPopover:self.popoverController];
    
    */  


-(void) selectedTableView:(NSString*)text
    NSLog(@"selectedTableView: %@", text);

    [self.popoverController dismissPopoverAnimated:YES];
    [self.popoverController.delegate popoverControllerDidDismissPopover:self.popoverController];


- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popover
    NSLog(@"popoverControllerDidDismissPopover");

    tableViewController.delegate = nil;
    [tableViewController release];
    tableViewController = nil;

    popoverController.delegate = nil;
    [popoverController release];
    popoverController = nil;

【讨论】:

以上是关于如何正确关闭 UIPopover?的主要内容,如果未能解决你的问题,请参考以下文章

更改通过 UIPopOver (iPad) 呈现的 UIImagePicker 的大小

从自定义 UIPopOver 问题推送新的 UIViewController

如何从另一个 UIPopover 控制器打开 UIPopover 控制器?

如何设置 Popover 视图以正确关闭

自定义material-ui popover [重复]

UIPopover 中的 UIDatePicker