如何正确解雇UIPopover?

时间:2011-02-21 21:04:58

标签: iphone uibarbuttonitem uipopovercontroller

当用户触摸右侧按钮按钮时,我已将UIPopover添加到导航栏。 我想知道什么是显示和解雇popover的最干净的编码。使用下面的代码,它可以工作,但不正确。 如果用户首先触摸右栏按钮,则会出现弹出窗口。现在他可以选择一个细胞,......有效。或者你可以在弹出窗口外触摸它消失。两种方式都正确。

但是当触摸右侧按钮按钮并且之后,再次触摸该图标时,您必须再次触摸它以再次调出该弹出窗口。 (不是第一次接触)。

那个正确的功能怎么样?谢谢你的时间..

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

2 个答案:

答案 0 :(得分:2)

<强>评论

您的downloads:方法检查tableViewController值并决定是否应显示或取消UIPopoverController。但是你的selectedTable:方法会解除popoverController并且不会将tableViewController设置为nil,因此它无法按预期工作。

而且我也没有看到UIPopoverControllerDelegate实施,尤其是popoverControllerDidDismissPopover:会告诉您何时UIPopoverController被解雇(例如,通过触摸UIPopoverController以外的地方)。< / p>

内存管理

阅读内存管理指南。带有[self.popoverController release]的{​​{1}}导致崩溃 - 在设置为nil期间发布一次和第二次释放。 (我假设你的self.popoverController = nil财产保留。)

答案 1 :(得分:0)

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