如何正确关闭 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