2010-11-18 13 views
0

Ich habe einen solchen Fehler: wenn ich auf navigationbar.backItemButton klicke, zeige ich UIAlertView mit zwei Schaltflächen an. Wenn ich auf eine von ihnen drücke, wird die Anwendung nur mit EXC_BAD_ACCESS beendet. Methode - (void) alertView: (UIAlertView *) alertView clickedButtonAtIndex: (NSInteger) buttonIndex wird nicht aufgerufen. Wie kann ich es lösen? Danke!UIAlertView beendet EXC_BAD_ACCESS Fehler

// h - Datei

@interface DetailsTableViewController : UITableViewController <UITextFieldDelegate, UIAlertViewDelegate> 

// m - Datei

- (void)viewWillDisappear:(BOOL)animated 
{ 
    //if changes unsaved - alert reask window 
    if (isDirty) 
    { 
     UIAlertView *message = [[UIAlertView alloc] initWithTitle:@"Save changes?" 
                 message:@"Press YES if you want to save changes before exit, NO - other case." 
                delegate: self 
                cancelButtonTitle: @"NO" 
                otherButtonTitles: @"YES", nil]; 

     [message show]; 

     [message autorelease]; 
    } 
} 

    - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    NSString *title = [alertView buttonTitleAtIndex: buttonIndex]; 

    if([title isEqualToString: @"YES"]) 
    { 
     [self saveBtnUserClick];  
    } 
} 

Antwort

3

Ich denke, das Problem ist, dass nach dem Zurück Tippen Schaltfläche wird der aktuelle Controller aus dem Navigations-Stack entfernt und freigegeben, so wenn Alarm versucht, seine Delegate-Methoden ruft es sie auf freigegebenen Objekt, was EXC_BAD_ACCESS Fehler führt. Zur Umgehung des Problems I 2 offensichtliche Optionen sehen (obwohl es sein kann, bessere Lösungen):

  1. extra behalten Ihren Controller irgendwo (in vorherigen Controller sein kann), aber Sie müssen herausfinden, wie es zu lösen, wenn du bist erledigt.
  2. Erstellen Sie Ihre benutzerdefinierte Schaltfläche statt Standard "zurück" und zeigen Sie nur Alarm, wenn es angezapft. Dann in der Delegate-Methode des Alarms den aktuellen Controller aus dem Navigations-Stack holen.
+0

Sie hatten Recht! dealloc genannt. Ich habe versucht [self.tableView behalten]; und [selbstbehalten]; aber stürzt immer noch ab. Ich brauche nicht links Taste, sondern BackItemButton. Gibt es Lösungen dafür? Danke. – yozhik

+0

Wo rufst du dich an? Dieses Konstrukt sieht nicht gut für mich aus ... – Vladimir

+0

in viewWillDisapper, und versucht, in Dealloc – yozhik

1

Ist Ihr View-Controller die UIAlertViewDelegate implementieren? Wenn nicht, fügen Sie in Ihrer Interface-Deklaration vor {startet ein.

Versuchen Sie auch, NSLogging innerhalb der clickedButtonAtIndex-Methode und drucken Sie die ButtonIndex-Werte und sehen Sie die Konsole.

Bearbeiten: Lesen Sie Ihren Beitrag erneut, ich denke, Sie haben in der Tat die UIAlertViewDelegate in Ihrer Schnittstellenkennung verpasst.

+0

lesen Sie noch einmal, es ist schon da und der Fehler ist immer noch. – yozhik

+0

ah Ich sehe, dass Sie es bearbeitet haben. Es war vorher nicht da, also habe ich es falsch verstanden. Ich denke, Vladimirs Theorie sieht sehr plausibel aus. Schau es dir an. – Bourne

1

Wahrscheinlich [Nachricht Autorelease]; ist der Fehler [Nachrichtenausgabe];

Weil Sie [[UIAlertView alloc] init .....]; dort für Sie sollte die Erinnerung freigeben.

Autorelease ist etwas funktioniert mit der Struktur, die Speicher compilerabhängig ist oder Sie den Speicher nicht manuell gegeben haben.

Genießen.

+0

Wahrscheinlich [Nachricht Autorelease]; Ist das ein Fehler? [message release]; Nein, ich habe es versucht. – yozhik

2

Versuchen, Delegat auf Null anstelle von Selbst zu ändern. Es hat mein Problem behoben.

0

"Versuchen Sie Delegate zu Nil anstelle von sich selbst zu ändern. Es behoben mein Problem." hat für mich gearbeitet. Danke