当用户触摸右侧按钮按钮时,我已将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];
}
答案 0 :(得分:2)
<强>评论强>
您的downloads:
方法检查tableViewController
值并决定是否应显示或取消UIPopoverController。但是你的selectedTable:
方法会解除popoverController
并且不会将tableViewController
设置为nil,因此它无法按预期工作。
而且我也没有看到UIPopoverControllerDelegate
实施,尤其是popoverControllerDidDismissPopover:
会告诉您何时UIPopoverController
被解雇(例如,通过触摸UIPopoverController
以外的地方)。< / p>
内存管理
阅读内存管理指南。带有[self.popoverController release]
的{{1}}导致崩溃 - 在设置为nil期间发布一次和第二次释放。 (我假设你的self.popoverController = nil
财产保留。)
答案 1 :(得分:0)
-(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;
}