如何以编程方式创build的uibutton以编程方式显示popover(不使用界面生成器)

我有一个button,我已经在视图控制器内编程创build。 一旦button被按下,我希望它使用一种方法来编程创buildpopover。

在我的视图controller.m中的ViewDidLoad中创build的button

UIView *moreFundInfoView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 540, 620)]; [self.view addSubview:moreFundInfoView]; [moreFundInfoView setBackgroundColor:[UIColor RMBColor:@"b"]]; btnContact = [UIButton buttonWithType:(UIButtonTypeRoundedRect)]; [btnContact setFrame:CGRectMake(390, 575, contactButton.width, contactButton.height)]; btnContact.hidden = NO; [btnContact setTitle:@"Contact" forState:(UIControlStateNormal)]; [moreFundInfoView addSubview:btnContact]; [btnContact addTarget:self action:@selector(showContactDetails:) forControlEvents:UIControlEventTouchUpInside]; 

然后我有我按下button时使用的方法。

 -(void) showContactDetails: (id) sender { UIViewController *popoverContent = [[UIViewController alloc]init]; UIView *popoverView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 200, 300)]; [popoverView setBackgroundColor:[UIColor RMBColor:@"b"]]; popoverContent.view = popoverView; popoverContent.contentSizeForViewInPopover = CGSizeMake(200, 300); UIPopoverController *contactPopover =[[UIPopoverController alloc] initWithContentViewController:popoverContent]; [contactPopover presentPopoverFromRect:btnContact.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES ]; [contactPopover setDelegate:self]; 

}

我在这里错过了什么? 因为它运行良好,但只要我点击button应用程序崩溃。 我认为这是一个代表问题,但我不确定。 任何意见,将不胜感激。

我认为这个代码会帮助你。 你肯定缺less委托方法

 ViewController *viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil]; UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController]; UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:navigationController]; popover.delegate = self; popover.popoverContentSize = CGSizeMake(644, 425); //your custom size. [popover presentPopoverFromRect:button.frame inView:self.view permittedArrowDirections: UIPopoverArrowDirectionLeft | UIPopoverArrowDirectionUp animated:YES]; 

只要确保你不忘记UIPopover委托方法,否则应用程序肯定会崩溃。 这是强制性的。

  UIViewController *controller = [[UIViewController alloc] init]; [view removeFromSuperview]; //view is a view which is displayed in a popover controller.view = view; UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:controller]; popover.delegate = self; [popover presentPopoverFromRect:button.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES]; 

我所要做的只是在.h文件中将属性从“retain”更改为“strong”,并且它可以正常工作,阻止应用程序崩溃。

是的,将“retain”属性更改为“strong”使您可以保留选取器视图对象。 我认为你的代码的问题是,当方法结束时,UIPopoverController对象被自动释放。 使强大的财产让你强烈指出一个对象。