【问题标题】:How to dismiss a UIPopover correctly?如何正确关闭 UIPopover?
【发布时间】: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];
    }

【问题讨论】:

    标签: iphone uibarbuttonitem uipopovercontroller


    【解决方案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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-31
        • 2012-06-27
        • 2017-03-29
        • 2019-07-20
        • 2019-04-12
        • 2019-09-24
        • 1970-01-01
        相关资源
        最近更新 更多