【问题标题】:Detecting of popover dismiss检测弹出框关闭
【发布时间】:2012-05-06 08:35:07
【问题描述】:

我想玩 UIPopupController,但我知道我无法检测到我的弹出框何时消失。 我的步骤:
1. 从 XCode 创建示例(文件 -> 新建项目 -> 实用程序)
2. 添加到MainViewController.h UIPopoverControllerDelegate

#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 = UIModalTransitionStyleFlipHorizo​​ntal; [自我presentModalViewController:控制器动画:YES]; } 别的 { 如果(!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.flipsidePopoverControllerdismissPopoverAnimated:YES]; } 别的 { [self.flipsidePopoverController presentPopoverFromBarButtonItem:sender allowedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; } } } -(void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController { NSLog(@"OLOLO"); }

但是当我点击某个地方并且弹出框消失时,控制台中没有 NSLog 消息。 我做错了什么?

【问题讨论】:

  • 您正在设置委托之前您实例化弹出控制器。也就是说,设置delegate的时候不存在

标签: ios uipopovercontroller


【解决方案1】:

将弹出框的代表设置为self,您也可以使用两个弹出框代表,即:-

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

【讨论】:

  • 请记住,didDismiss 函数仅在弹出框自行关闭时被调用,例如在其外部进行触摸。如果您通过自己的代码(例如按下按钮)自行关闭它,则不会调用它。
【解决方案2】:

较早的答案建议使用 UIPopoverControllerDelegate,这似乎是实现目标的唯一明智方法。我认为添加一个实际示例会很好,因为这不是最简单的事情。我的要求很简单 - 我希望在弹出框可见的同时模糊背景视图,因此步骤如下:

  1. 在情节提要中连接您的弹出框,在目标视图控制器属性中配置它的弹出框内容大小。

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

    @interface MyController : UIViewController <UIPopoverControllerDelegate>
    
  3. 覆盖 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;
    }
    
  4. 实现popover委托方法popoverControllerDidDismissPopover。将 alpha 设置回 1.0 并取消将自己指定为委托,以确保我们不会阻止 ARC 完成它的工作:

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

【讨论】:

  • 请记住,didDismiss 函数仅在弹出框自行关闭时被调用,例如在其外部进行触摸。如果您通过自己的代码(例如按下按钮)自行关闭它,则不会调用它。
【解决方案3】:

您是否将 MainViewController 实例设置为弹出框的委托?

(如果您通过代码创建弹出框) popover.delegate = self;

【讨论】:

  • FlipsideViewController *controller = [[FlipsideViewController alloc] initWithNibName:@"FlipsideViewController" bundle:nil]; controller.delegate = self;
  • 添加了一些示例代码,负责创建弹出框。
  • 您没有设置弹出框实例的委托。您正在设置弹出框 content 的委托。设置弹出窗口委托:self.flipsidePopoverController.delegate = self。现在您应该在弹出框被关闭时收到消息。 (看看当你用问题代码发布一个明确的问题时,这有多容易)。
  • 添加了 self.flipsidePopoverController.delegate = self 而不是 controller.delegate = self - 没有效果。然后尝试在controller.delegate = self 之后添加 - 仍然没有效果。
  • 发布更新的代码(编辑您的原始问题 + 替换那里的代码)。
【解决方案4】:
- (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];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多