首页 文章

检测popover dismiss

提问于
浏览
7

我想玩UIPopupController,我明白我无法检测到我的popover解雇 . 我的步骤:
1.从XCode创建示例(文件 - >新项目 - >实用应用程序)
2.添加到MainViewController.h UIPopoverControllerDelegate

#import "FlipsideViewController.h"

@interface MainViewController : UIViewController <FlipsideViewControllerDelegate,UIPopoverControllerDelegate>

@property (strong, nonatomic) UIPopoverController *flipsidePopoverController;

- (IBAction)showInfo:(id)sender;

@end
  • 在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消失时,Console中没有NSLog消息 . 我究竟做错了什么?

4 回答

  • 15

    将popover的代表设置为self,你也可以使用两个popover代理,即: -

    /* 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;
    
  • 5

    早期的答案建议使用UIPopoverControllerDelegate,这似乎是实现目标的唯一合理方式 . 我认为添加一个实际的例子会很好,因为这不是最简单的事情 . 我的要求很简单 - 我希望背景视图模糊,而弹出窗口是可见的,所以这里是步骤:

    • 在故事板中连接弹出窗口,在目标视图控制器属性中配置它的弹出窗口内容大小 .

    • 通过打开.h文件并执行以下操作,使源视图控制器成为UIPopoverControllerDelegate:

    @interface MyController : UIViewController <UIPopoverControllerDelegate>
    
    • 覆盖prepareForSegue,将源视图控制器指定为弹出窗口的委托,然后在segue显示目标之前将alpha设置为0.5:
    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
        UIStoryboardPopoverSegue* popover = (UIStoryboardPopoverSegue*)segue;
        popover.popoverController.delegate = self;
        self.view.alpha = 0.5;
    }
    
    • 实现popover委托方法popoverControllerDidDismissPopover . 将alpha设置回1.0并取消分配给代表,以确保我们不会停止ARC执行它的工作:
    -(void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController {
        self.view.alpha = 1.0;
        popoverController.delegate = nil;
    }
    
  • 0

    您是否将MainViewController实例设置为popover的委托?

    (如果你通过代码创建popover) popover.delegate = self;

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

相关问题