2014-01-09 3 views
16

Ich möchte ein Popup hinzufügen, wenn jemand die "Zurück" -Schaltfläche meiner iOS App drückt, um den Benutzer zu fragen, ob er wirklich zurückkommen möchte. Abhängig von der Antwort des Benutzers möchte ich dann die Aktion rückgängig machen oder fortfahren. Ich habe versucht, den Code in der viewWillDisappear Funktion meiner Ansicht hinzuzufügen und dann den richtigen Delegaten zu schreiben, aber es funktioniert nicht, da es immer die Ansicht ändert und dann das Popup anzeigt. Mein Code ist:Wie erstelle ich eine Bestätigung? Pop Up beim Drücken der Zurück-Taste in iOS?

-(void) viewWillDisappear:(BOOL)animated { 
     _animated = animated; 
     if ([self.navigationController.viewControllers indexOfObject:self]==NSNotFound) { 
      UIAlertView *alert_undo = [[UIAlertView alloc] initWithTitle:@"UIAlertView" 
                   message:@"You could be loosing information with this action. Do you want to proceed?" 
                   delegate:self 
                 cancelButtonTitle:@"Go back" 
                 otherButtonTitles:@"Yes", nil]; 
      [alert_undo show]; 
     } 
     else [super viewWillDisappear:animated]; 
    } 

und der Delegierte Implementierung ist:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    NSString *title = [alertView buttonTitleAtIndex:buttonIndex]; 
    if([title isEqualToString:@"Yes"]) 
    { 
     [super viewWillDisappear:_animated]; 
    } 
} 

Dies ist gar nicht funktioniert. Hat jemand jetzt einen besseren Weg, oder was könnte falsch sein?

Vielen Dank,

Antwort

14

Danke für deine Antwort, @staticVoidMan! Ich habe deinen Code schließlich mit einigen Änderungen verwendet. Die Zurück-Schaltfläche kann nicht geändert werden, daher sollte man eine zusätzliche Schaltfläche erstellen und die Standard-Schaltfläche ausblenden. Das einzige Problem ist der Stil der neuen "Zurück" -Schaltfläche, die nicht gleich der Standard ist. Der endgültige Code lautet:

- (void)viewDidLoad 
{ 

    self.navigationItem.hidesBackButton = YES; 
    UIBarButtonItem *bbtnBack = [[UIBarButtonItem alloc] initWithTitle:@"Back" 
                   style:UIBarButtonItemStyleBordered 
                   target:self 
                   action:@selector(goBack:)]; 

    self.navigationItem.leftBarButtonItem = bbtnBack; 

} 

- (void)goBack:(UIBarButtonItem *)sender 
{ 
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Alert" 
                message:@"...Do you want to proceed?" 
                delegate:self 
              cancelButtonTitle:@"No" 
              otherButtonTitles:@"Yes", nil]; 
    [alert show]; 
} 

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    switch(buttonIndex) { 
     case 0: //"No" pressed 
      //do something? 
      break; 
     case 1: //"Yes" pressed 
      //here you pop the viewController 
      [self.navigationController popViewControllerAnimated:YES]; 
      break; 
    } 
} 
+0

@AlexSpencer Bitte vermeiden Sie Beiträge zu bearbeiten, um den Code mit Ihren eigenen Ideen zu verbessern. Sie können einen Kommentar hinzufügen, um Verbesserungen vorzuschlagen. Siehe die Richtlinien hier: http://stackoverflow.com/help/editing – SysDragon

+0

@SysDragon war es eine subtile Veränderung. aber es ist nicht meine Meinung. Siehe diesen Link: https: //stackoverflow.com/questions/4649423/should-switch-statements-always-contain-a-default-klause –

+0

@AlexSpencer Das ist über gute Programmierpraktiken, nicht über andere Inhalte zu bearbeiten. Auf dieser Seite sollten Sie ** Beiträge nicht bearbeiten, um neuen Code zur Verbesserung hinzuzufügen. Sie können das in einem Kommentar vorschlagen. – SysDragon

17

Sobald -viewWillDisappear: genannt wird, nicht da ist dein viewController verschwinden zu stoppen.

Sie sollten im Idealfall überschreiben die navigationBar ‚s zurück-Taste an und es ist Methode, zeigen die alert (der Rest ziemlich viel ist das gleiche)

- (void)viewDidLoad 
{ 
    //... 
    UIBarButtonItem *bbtnBack = [[UIBarButtonItem alloc] initWithTitle:@"Back" 
                   style:UIBarButtonItemStyleBordered 
                   target:self 
                   action:@selector(goBack:)]; 

    [self.navigationItem setBackBarButtonItem: bbtnBack]; 
} 

- (void)goBack:(UIBarButtonItem *)sender 
{ 
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Alert" 
                message:@"...Do you want to proceed?" 
                delegate:self 
              cancelButtonTitle:@"No" 
              otherButtonTitles:@"Yes", nil]; 
    [alert show]; 
} 

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    switch(buttonIndex) { 
     case 0: //"No" pressed 
      //do something? 
      break; 
     case 1: //"Yes" pressed 
      //here you pop the viewController 
      [self.navigationController popViewControllerAnimated:YES]; 
      break; 
    } 
} 

HINWEIS: Vergessen Sie nicht, zu erklären <UIAlertViewDelegate> in der .h Datei dieses viewController

+0

@recasens: Gern geschehen. Markieren Sie Ihre Antwort als akzeptiert, ich werde es auch upvote :) sowieso, technisch ... sowohl '[self.navigationItem setLeftBarButtonItem: bbtnBack];' oder '[self.navigationItem setBackBarButtonItem: bbtnBack];' sollte funktionieren (_in your case_) – staticVoidMan

Verwandte Themen