检测popover关闭

问题描述:

我想玩UIPopupController,并且我明白我无法检测到我的popover关闭时。 我的步骤:
1.创建例如在Xcode(文件 - >新建项目 - > Utilitiy应用)
2.添加到MainViewController.h UIPopoverControllerDelegate检测popover关闭

#import "FlipsideViewController.h" 

@interface MainViewController : UIViewController <FlipsideViewControllerDelegate,UIPopoverControllerDelegate> 

@property (strong, nonatomic) UIPopoverController *flipsidePopoverController; 

- (IBAction)showInfo:(id)sender; 

@end 
  1. 在MainViewController:
 

    - (IBAction)showInfo:(id)sender 
    { 
     if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { 
      FlipsideViewController *controller = [[FlipsideViewController alloc] initWithNibName:@"FlipsideViewController" bundle:nil]; 
      controller.delegate = self; 
      controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 
      [self presentModalViewController:controller animated:YES]; 
     } else { 
      if (!self.flipsidePopoverController) { 
       FlipsideViewController *controller = [[FlipsideViewController alloc] initWithNibName:@"FlipsideViewController" bundle:nil]; 
       controller.delegate = self; 

       self.flipsidePopoverController.delegate = self 

       self.flipsidePopoverController = [[UIPopoverController alloc] initWithContentViewController:controller]; 
      } 
      if ([self.flipsidePopoverController isPopoverVisible]) { 
       [self.flipsidePopoverController dismissPopoverAnimated:YES]; 
      } else { 
       [self.flipsidePopoverController presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 
      } 
     } 
    } 

    -(void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController 
    { 
     NSLog(@"OLOLO"); 
    } 

但是当我点击某处并且popover消失时,控制台中没有NSLog消息。 我在做什么错?

+4

要设置委托* *之前**你实例化popover控制器。换句话说,当您设置代表 – 2012-04-25 21:47:06

+0

真相,真相时,它不存在。非常感谢! – 2012-04-26 08:45:47

您是否将您的MainViewController实例设置为弹出窗口的代表?

(如果您创建通过代码酥料饼) popover.delegate = self;

+0

FlipsideViewController * controller = [[FlipsideViewController alloc] initWithNibName:@“FlipsideViewController”bundle:nil]; controller.delegate = self; – 2012-04-25 16:24:51

+0

它已经在那里。 – 2012-04-25 16:39:05

+0

这是你如何创建popover?发布更多代码 – 2012-04-25 16:49:43

设置酥料饼自我的代表,你也可以使用两个酥料饼的代表,即: -

/* Called on the delegate when the popover controller will dismiss the popover. Return NO to prevent the dismissal of the view. 
*/ 
- (BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popoverController; 

/* Called on the delegate when the user has taken action to dismiss the popover. This is not called when -dismissPopoverAnimated: is called directly. 
*/ 
- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController; 
+1

请记住,didDismiss函数仅在popover解散时自动调用,例如在它之外触摸。如果你自己用自己的代码解雇它(例如从一个按钮按下),那么它将不会被调用。 – CMash 2017-03-30 12:26:30

早些时候答案已经使用建议UIPopoverControllerDelegate似乎是实现目标的唯一明智的方式。我认为增加一个实际的例子会很好,因为这不是最简单的事情。我的要求很简单 - 我想是模糊的背景视图而酥料饼是可见的,所以这里的步骤:

  1. 线了一个故事板的酥料饼,配置它在目标视图控制器酥料饼的内容大小属性。

  2. 让你的源视图控制器打开.h文件,并做一些这样的UIPopoverControllerDelegate:

    @interface MyController : UIViewController <UIPopoverControllerDelegate> 
    
  3. 覆盖prepareForSegue,分配你的源视图控制器为代表的酥料饼,然后设置阿尔法0.5之前的SEGUE提出目标:

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
        UIStoryboardPopoverSegue* popover = (UIStoryboardPopoverSegue*)segue; 
        popover.popoverController.delegate = self; 
        self.view.alpha = 0.5; 
    } 
    
  4. 落实酥料饼的委托方法popoverControllerDidDismissPopover。设置阿尔法回到1.0和取消自己作为代表,以确保我们不阻止ARC做的工作:

    -(void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController { 
        self.view.alpha = 1.0; 
        popoverController.delegate = nil; 
    } 
    
+1

请记住,didDismiss函数仅在popover解散时自动调用,例如在它之外触摸。如果你自己用自己的代码解雇它(例如从一个按钮按下),那么它将不会被调用。 – CMash 2017-03-30 12:26:51

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
UIStoryboardPopoverSegue *popoverSegue; 
popoverSegue = (UIStoryboardPopoverSegue *)segue; 
popoverController = popoverSegue.popoverController; 
pCVisible = YES; 
[[segue destinationViewController] setDelegate:self]; 
} 

- (void) setDataFromPopover { 
    if (pCVisible) { 
    [popoverController dismissPopoverAnimated:YES]; // THIS IS KEY! this is where the popover is dismissed, not in the popover itself 
    } 
} 

而且

//TableViewController.m 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:  (NSIndexPath *)indexPath 
{ 
    //variable = whatever 

OtherViewController *initialView; 
initialView=(OtherViewController *)self.delegate; 
initialView.theLabel.text = variable; 
[initialView setDataFromPopover]; 
}