2013-02-08 13 views
15

Ho un pulsante che ho creato a livello di programmazione in un controller di visualizzazione. Una volta premuto il pulsante, voglio che utilizzi un metodo per creare il popover a livello di codice.Come visualizzare un popover a livello di codice da un pulsante Uibutton creato anche a livello di codice (Non utilizzando il generatore di interfacce)

Il pulsante che si crea nel viewDidLoad a mio avviso 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]; 

allora ho il metodo che uso quando si preme il pulsante.

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

}

Che cosa mi manca qui? Perché funziona bene, ma non appena faccio clic sul pulsante l'app si blocca. Penso che sia un problema dei delegati, ma non ne sono sicuro. Tutto il consiglio sarebbe apprezzato.

+1

potresti darci il registro di emergenza? Sarebbe utile sapere dove il problema è –

+0

@ValentinRocher ancora un po 'di n00b, ma questo è l'output quando si blocca. appname- [dealloc UIPopoverController] raggiunto mentre il popover è ancora visibile./-[UliminatoUliminazioneUIPopoverController] mentre il popover è ancora visibile. – Berns

+0

Ciao, sono riuscito a sistemarlo, beh, anche un po 'troppo. Ho appena modificato la proprietà di UIPopoverController e funziona, solo che punta verso il basso anziché su, ma viene visualizzato almeno e l'app non si arresta in modo anomalo. – Berns

risposta

1

Tutto quello che dovevo fare era cambiare la proprietà da "conserva" a "forte" nel file .h e funziona, l'app si è arrestata in modo anomalo.

+4

se ciò risolve il problema, puoi accettare la tua risposta. – Vineeth

32

Penso che questo codice ti aiuterà. Si sono certamente mancate metodi delegato

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

Basta fare in modo che non dimentichi metodi UIPopover delegato o altra applicazione andrà in crash sicuramente. È obbligatorio.

+3

L'uso di UINavigationController è totalmente opzionale. Puoi saltare la creazione del suo oggetto. Solo per informazione. Buona programmazione. –

1

Sì, la modifica della proprietà per "conserva" su "forte" consente di mantenere l'oggetto vista di selezione. Penso che il problema con il tuo codice sia stato, l'oggetto UIPopoverController viene deallocato automaticamente al termine del metodo. fare una forte proprietà ti porta a puntare con forza un oggetto.

2
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]; 
Problemi correlati