2013-08-05 20 views
23

Come posso chiamare viewwillappear dopo aver escluso modalviewcontroller?Chiamare viewwillappear dopo aver eliminato modalviewcontroller

Qualsiasi idea si prega perché dopo respingendo la mia viewwillappear non ha ottenuto chiamato:

presentare il mio viewcontroller modale: // firsviewcontroller:

-(IBAction)AddActivity:(id)sender{ 


    CreateActivity *addViewController = [[CreateActivity alloc] initWithNibName:@"CreateActivity" bundle:nil]; 

    addViewController.delegate = self; 
    addViewController.modalPresentationStyle = UIModalPresentationFormSheet; 

    addViewController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 

    [self presentModalViewController:addViewController animated:YES]; 


    addViewController.view.superview.frame = CGRectMake(50, 260, 680, 624); 

} 

// secondvioewcontroller: creo un alertview a respingere questo modalview, ma il viewwillapear non è stato chiamato:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{ 
    if (buttonIndex == 0){ 


     if ([self respondsToSelector:@selector(presentingViewController)]){ 
      [self.presentingViewController dismissModalViewControllerAnimated:YES]; 
     } 
     else { 
      [self.parentViewController dismissModalViewControllerAnimated:YES]; 
     } 
    } 
} 
+3

Sei sicuro? Come stai controllando? Nella mia esperienza viewWillAppear si attiva sempre per il controller della vista che presenta quando la modal presentata viene ignorata. – geraldWilliam

+0

Ho modificato il mio post per vedere cosa ho fatto, cosa mi manca? –

+0

@OuassimMouyarden È necessario imparare a pensare a OOP correttamente prima di andare dritto nelle cose. Detto questo, ti aiuterò ancora, per ora. Cosa vuoi che succeda esattamente quando viene premuto un pulsante sul tuo UIAlertView? –

risposta

11

Dato che stai presentando he controller modal view come modulo, la vista del controller che presenta non scompare mai, quindi viewWillAppear: non viene chiamato dopo il licenziamento. Se si desidera che il controller della vista di presentazione gestisca qualcosa dopo il licenziamento, chiamare un metodo delegato nel metodo viewDidDisappear: del controller modale. Hai già impostato il delegato, quindi presumo che tu abbia già un protocollo delegato in CreateActivity.

A proposito, è necessario utilizzare i metodi non deprecati per presentare e chiudere il controller della visualizzazione modale.

+0

invece di chiamare un metodo delegato è possibile eseguire il codice nel completamento: per dismissViewController: animated: completion :.Posizionare il codice in viewDidDisappear potrebbe avere problemi se il controller fa parte di uno stack nav (ad esempio, premi un altro controller ..) Se vuoi comunque utilizzare viewDidDisappear, assicurati di controllare self.isBeingDismissed. – TomSwift

12

presentModalViewController:animated:/dismissModalViewControllerAnimated: sono obsoleti. Utilizzare invece presentViewController:animated:completion:/dismissViewControllerAnimated:completion:.

È possibile utilizzare il blocco di completamento di eseguire qualsiasi codice postale dismisal:

- (void) alertView: (UIAlertView *) alertView clickedButtonAtIndex: (NSInteger) buttonIndex 
{ 
    if (buttonIndex == 0) 
    { 
     MyCustomViewController* mcvc = (MyCustomViewController*)self.presentingViewController; 

     [self dismissViewControllerAnimated: YES completion: ^{ 

      // call your completion method: 
      [mcvc someCustomDoneMethod]; 
     }]; 
    } 
} 

Meglio ancora, se si sta utilizzando uno storyboard, allora è possibile implementare una segue svolgimento e innescare il vostro codice di completamento nel callback di svolgimento metodo.

+0

grazie per la risposta, quindi [self.presentingViewController someCustomDoneMethod]; il someCustomDoneMethod deve essere definito nel mio firstviewcontroller, verrà chiamato dopo aver chiuso la modalview ?? –

+0

sì. probabilmente dovrai lanciare il presentViewController nel tuo tipo di controller personalizzato in modo da poter chiamare il metodo. Nota Sto facendo una modifica per l'esempio. Non è necessario chiamare dismissViewControllerAnimated sul controller della vista di presentazione. Puoi semplicemente chiamarlo contro se stessi. – TomSwift

Problemi correlati