Project : Hour11-20140922-01
一、手工显示弹出框:
1、定义一个popover segue和一个action
2、action内调用方法performSegueWithIdentifier
-(IBAction)showPPVbyCoding:(id)sender {
[selfperformSegueWithIdentifier:@"showPOPOVER" sender:self];
}
二、以编程方式创建并显示popover
- (IBAction)createPopobyCoding:(id)sender {
UIStoryboard *mainSB=[UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle] ];
EditorViewController *editorVC=[mainSB instantiateViewControllerWithIdentifier:@"PopoVerScene"];
self.editorPOPOVERController=[[UIPopoverController alloc]initWithContentViewController:editorVC];
self.editorPOPOVERController.popoverContentSize=CGSizeMake(300, 300);
self.editorPOPOVERController.delegate=self;
[self.editorPOPOVERController presentPopoverFromRect:((UIButton *)sender).frame inView:self .view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}
二、关闭弹出框的响应
方式1、popoverControllerDidDismissPopover
按照说明只要遵守了协议UIPopoverControllerDelegate,并在方法内将popoverController.delegate设置为self,即ViewControler后,当弹出框关闭时,将调用ViewController.m中的方法popoverControllerDidDismissPopover
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if([segue.identifier isEqualToString:@"showPOPOVER"]) {
((UIStoryboardPopoverSegue*)segue).popoverController.delegate=self;
}
}
但在XCODE6中,如果是GUI创建的segue,无论是点击弹出框外关闭还是使用dismiss方法关闭,popoverControllerDidDismissPopover方法都没有调用(后续研究),只有手工创建popover并显示,才会调用popoverControllerDidDismissPopover。
而从体验上讲,用popoverControllerShouldDismissPopover方法更好,这个会在popover消失前就处理动作,而popoverControllerDidDismissPopover会在popover消失后才处理,会有延时。
代码如下:
-(void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController{
NSLog(@"call popoverControllerDidDismissPopover");
NSString*emailstr;
emailstr=((EditorViewController*)popoverController.contentViewController).textfield_popover.text;
self.emaillabel2.text=emailstr;
}
或者:
-(BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popoverController{
NSLog(@"call popoverControllerShouldDismissPopover");
NSString*emailstr;
emailstr=((EditorViewController*)popoverController.contentViewController).textfield_popover.text;
self.emaillabel2.text=emailstr;
returnYES;
}
方式2、不需要使用协议,只要使用prepareForSegue的segue.destinationViewController以及presentingViewController
在场景A:
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
((EditorViewController*)segue.destinationViewController).email=self.emaillabel.text;
}
在场景B:
-(void)viewWillDisappear:(BOOL)animated{
((ViewController*)self.presentingViewController).emaillabel.text=self.emailtextfield.text;
}
三、其他
1、设置弹出框的大小:是设置ViewController的大小,不是view的,view的没得设置,跟VC的一样大
另外,如果勾选了Preferred Explicit Size,
则自定义大小是不生效的:
self.editorPOPOVERController.popoverContentSize=CGSizeMake(300,300);
最后推荐干货,自然音乐大师Dan Gibson,边coding边听大自然的声音,倍儿轻松!