检测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
- 在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消息。 我在做什么错?
您是否将您的MainViewController实例设置为弹出窗口的代表?
(如果您创建通过代码酥料饼) popover.delegate = self;
FlipsideViewController * controller = [[FlipsideViewController alloc] initWithNibName:@“FlipsideViewController”bundle:nil]; controller.delegate = self; – 2012-04-25 16:24:51
它已经在那里。 – 2012-04-25 16:39:05
这是你如何创建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;
请记住,didDismiss函数仅在popover解散时自动调用,例如在它之外触摸。如果你自己用自己的代码解雇它(例如从一个按钮按下),那么它将不会被调用。 – CMash 2017-03-30 12:26:30
早些时候答案已经使用建议UIPopoverControllerDelegate似乎是实现目标的唯一明智的方式。我认为增加一个实际的例子会很好,因为这不是最简单的事情。我的要求很简单 - 我想是模糊的背景视图而酥料饼是可见的,所以这里的步骤:
线了一个故事板的酥料饼,配置它在目标视图控制器酥料饼的内容大小属性。
-
让你的源视图控制器打开.h文件,并做一些这样的UIPopoverControllerDelegate:
@interface MyController : UIViewController <UIPopoverControllerDelegate>
-
覆盖prepareForSegue,分配你的源视图控制器为代表的酥料饼,然后设置阿尔法0.5之前的SEGUE提出目标:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { UIStoryboardPopoverSegue* popover = (UIStoryboardPopoverSegue*)segue; popover.popoverController.delegate = self; self.view.alpha = 0.5; }
-
落实酥料饼的委托方法popoverControllerDidDismissPopover。设置阿尔法回到1.0和取消自己作为代表,以确保我们不阻止ARC做的工作:
-(void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController { self.view.alpha = 1.0; popoverController.delegate = nil; }
请记住,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];
}
要设置委托* *之前**你实例化popover控制器。换句话说,当您设置代表 – 2012-04-25 21:47:06
真相,真相时,它不存在。非常感谢! – 2012-04-26 08:45:47