2013-08-05 16 views
23

Wie kann ich viewwillappear nach dem Schließen modalviewcontroller aufrufen?Aufruf von viewwilllappear nach dem Schließen von modalviewcontroller

Jede Idee, bitte, weil nach meiner viewwillappear Entlassung nicht aufgerufen:

meine Viewcontroller präsentiert modal: // 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: Ich erstellen Sie eine Alertview dies entlassen modalview, aber die viewwillpearear wurde nicht aufgerufen:

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

Sind Sie sicher? Wie überprüfen Sie? Nach meiner Erfahrung wird viewWillAppear immer für den präsentierenden View-Controller ausgelöst, wenn das präsentierte Modal nicht mehr existiert. – geraldWilliam

+0

Ich habe meinen Beitrag bearbeitet, um zu sehen, was ich getan habe, was ich vermisse? –

+0

@OuassimMouyarden Sie müssen lernen, über OOP richtig nachzudenken, bevor Sie direkt in die Dinge gehen. Davon abgesehen werde ich dir jetzt noch helfen. Was genau möchten Sie tun, wenn eine Schaltfläche auf Ihrer UIAlertView gedrückt wird? –

Antwort

11

Da präsentieren Sie t er modal view controller als Formularblatt, verschwindet die Sicht des Controllers nie, so dass viewWillAppear: nicht nach der Entlassung aufgerufen wird. Wenn Sie möchten, dass der Darstellungs-View-Controller nach der Entlassung etwas behandelt, rufen Sie eine Delegate-Methode in der Methode viewDidDisappear: des modalen Controllers auf. Sie haben den Delegaten bereits festgelegt, also nehme ich an, dass Sie bereits ein Delegate-Protokoll in CreateActivity haben.

Übrigens sollten Sie die nicht veralteten Methoden verwenden, um den Modalansicht-Controller anzuzeigen und zu schließen.

+0

Anstatt eine Delegate-Methode aufzurufen, können Sie Code in der Vervollständigung ausführen: für disneyViewController: animated: completion :.Das Platzieren des Codes in viewDidDisappear kann zu Problemen führen, wenn der Controller Teil eines Nav-Stacks ist (z. B. wenn Sie einen anderen Controller drücken.) Wenn Sie weiterhin viewDidDisappear verwenden möchten, müssen Sie self.isBeingDis Missted überprüfen. – TomSwift

12

presentModalViewController:animated:/dismissModalViewControllerAnimated: sind veraltet. Verwenden Sie stattdessen presentViewController:animated:completion:/dismissViewControllerAnimated:completion:.

können Sie den Abschluss Block verwenden einen Code Beitrag dismisal auszuführen:

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

Noch besser wäre es, wenn Sie ein Storyboard verwenden, dann können Sie eine Abwickelstation segue implementieren und Ihren Abschluss-Code in der Abwickler Rückruf auslösen Methode.

+0

danke für die Antwort, so [selb.presentingViewController someCustomDoneMethod]; die someCustomDoneMethod muss in meinem ersten Viewcontroller definiert werden, wird es aufgerufen, nach dem Modalview zu entlassen ?? –

+0

ja. Sie müssen den presentingViewController wahrscheinlich in Ihren benutzerdefinierten Steuerungstyp umwandeln, damit Sie die Methode aufrufen können. Hinweis: Ich führe eine Bearbeitung für das Beispiel durch. Sie müssen auf dem präsentierenden Ansichtscontroller nicht den Befehl "disneyViewControllerAnimated" aufrufen. Sie können es einfach gegen sich selbst nennen. – TomSwift

Verwandte Themen