UIAlertView завершает работу с ошибкой EXC_BAD_ACCESS - PullRequest
0 голосов
/ 18 ноября 2010

У меня такая ошибка: когда я нажимаю навигацию bar.backItemButton, я показываю UIAlertView с двумя кнопками. Когда я нажимаю на любое из них, приложение завершается только с EXC_BAD_ACCESS. Метод - (void) alertView: (UIAlertView *) alertView clickedButtonAtIndex: (NSInteger) buttonIndex не вызывается. Как я могу решить это? Thanx!

// ч - файл

@interface DetailsTableViewController : UITableViewController <UITextFieldDelegate, UIAlertViewDelegate>

// м - файл

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

Ответы [ 5 ]

3 голосов
/ 18 ноября 2010

Думаю, проблема в том, что после нажатия кнопки «Назад» ваш текущий контроллер удаляется из стека навигации и освобождается, поэтому, когда оповещение пытается вызвать его методы делегата, оно вызывает их для освобожденного объекта, что приводит к ошибке EXC_BAD_ACCESS. Чтобы обойти проблему, я вижу 2 очевидных варианта (хотя могут быть лучшие решения):

  1. Дополнительно сохраните ваш контроллер где-нибудь (в предыдущем контроллере может быть), но вам нужно найти способ освободить его, когда вы закончите.
  2. Создайте пользовательскую кнопку вместо стандартной кнопки «назад» и просто показывайте предупреждение, когда она нажата. Затем в методе делегата оповещения извлеките текущий контроллер из стека навигации.
2 голосов
/ 01 февраля 2013

Попробуйте изменить делегат на ноль вместо себя. Это исправило мою проблему.

1 голос
/ 18 ноября 2010

Вероятно [авто-релиз сообщения]; Вы ошиблись? [выпуск сообщения];

Поскольку вы использовали [[UIAlertView alloc] init .....]; там вам нужно освободить память.

autorelease - это то, что будет работать со структурой, память которой зависит от компилятора, или вы не дали память вручную.

Наслаждайтесь.

1 голос
/ 18 ноября 2010

Ваш контроллер представления реализует UIAlertViewDelegate? Если нет, добавьте объявление интерфейса перед {запусками.

Также попробуйте NSLogging внутри метода clickedButtonAtIndex, распечатайте значения buttonIndex и посмотрите консоль.

Редактировать: Читая ваше сообщение еще раз, я думаю, вы действительно пропустили UIAlertViewDelegate в объявлении интерфейса.

0 голосов
/ 19 ноября 2013

«Попробуйте сменить делегата на ноль, а не на себя. Это исправило мою проблему».работал на меня.Thanx

...