Cómo mostrar un popover programáticamente desde un uibutton que también se crea mediante progtwigción (No se usa el generador de interfaces)

Tengo un button que he creado mediante progtwigción en un controller de vista. Una vez que se presiona el button, quiero que use un método para crear el popover mediante progtwigción.

El button que se crea en ViewDidLoad en mi view controller.m

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]; 

Luego, tengo el método que uso cuando presiono el 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]; 

}

¿Que me estoy perdiendo aqui? Porque funciona bien, pero tan pronto como hago clic en el button, la aplicación se bloquea. Creo que es un tema de delegates, pero no estoy seguro. Cualquier consejo sería apreciado.

Creo que este código te ayudará. Ciertamente, te faltan los methods de delegado

 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]; 

Solo asegúrate de no olvidar los methods de UIPopover Delegate o de lo contrario la aplicación se bloqueará definitivamente. Es obligatorio.

  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]; 

Todo lo que tenía que hacer era cambiar la propiedad de "retener" a "fuerte" en el file .h y funciona, evitó que la aplicación fallara.

Sí, cambiar la propiedad para "retener" a "fuerte" hace que mantenga el object de vista del selector. Creo que el problema con su código fue que el object UIPopoverController se desasigna automáticamente cuando termina el método. hacer una propiedad fuerte te lleva a apuntar fuertemente a un object.