popToRootViewControllerAnimated дает «EXC_BAD_ACCESS» (но не может получить его с помощью NSZombie)

У меня есть навигационное приложение с несколькими представлениями. Когда я доберусь до последнего представления, приложение отправит электронное письмо (используя MailComposer). После этого хотелось бы вернуться к исходному виду.

Все работает нормально, но когда я пытаюсь вернуться на домашний экран, используя: [self.navigationController popToRootViewControllerAnimated: YES]; Приложение вылетит и выдаст ошибку «EXC_BAD_ACCESS». Я знаю, что могу отладить это с помощью NSZombie, но когда я пытаюсь получить ошибку в NSZombie, ошибка не появляется.

Как я могу это исправить? Или есть способ просто освободить все представления и перезагрузить первое представление? Любые советы или что-то еще, чтобы помочь мне, было бы здорово. Вот код:

    - (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error 
{   
// Notifies users about errors associated with the interface
switch (result)
{
        UIAlertView *alert;
    case MFMailComposeResultCancelled:
        NSLog(@"melding cancelled");
        alert = [[UIAlertView alloc]initWithTitle:@"Email afgebroken" message:nil delegate:self cancelButtonTitle:@"Ok"  otherButtonTitles:nil];
        [alert show];
        [alert release];
        break;
    case MFMailComposeResultSaved:
        NSLog(@"melding opgeslagen");
        alert = [[UIAlertView alloc]initWithTitle:@"Email opgeslagen" message:nil delegate:self cancelButtonTitle:@"Ok"  otherButtonTitles:nil];
        [alert show];
        [alert release];
        break;
    case MFMailComposeResultSent:
        NSLog(@"melding verzonden");            
        alert = [[UIAlertView alloc]initWithTitle:@"Email verzonden" message:nil delegate:self cancelButtonTitle:@"Ok"  otherButtonTitles:nil];
        [alert show];
        [alert release];
        [self saveMelding];
        break;
    case MFMailComposeResultFailed:
        NSLog(@"melding failed");
        alert = [[UIAlertView alloc]initWithTitle:@"Email mislukt te versturen" message:@"probeer het later nog eens" delegate:self cancelButtonTitle:@"Ok"  otherButtonTitles:nil];
        [alert show];
        [alert release];
        break;
    default:
        NSLog(@"melding niet verzonden");
        alert = [[UIAlertView alloc]initWithTitle:@"Email niet verzonden" message:nil delegate:self cancelButtonTitle:@"Ok"  otherButtonTitles:nil];
        [alert show];
        [alert release];
        break;
}
[self dismissModalViewControllerAnimated:YES];
}
- (void)alertView:(UIAlertView *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
if (buttonIndex == 0)
{
    NSLog(@"ok");
    [self.navigationController popToRootViewControllerAnimated:YES];
}
}

person Th3noon    schedule 09.08.2011    source источник
comment
Вы пытались пропустить (или эмулировать с помощью кнопки) почтовый проход, а затем попытались перейти к корневому контроллеру представления (таким образом, вызывая непосредственно метод popToRootViewController). По крайней мере, вы можете увидеть, связана ли проблема с корневым контроллером, который был перегружен.   -  person viggio24    schedule 09.08.2011
comment
Возможно, объект rootviewcontroller был выпущен   -  person Tendulkar    schedule 09.08.2011
comment
Когда я пропускаю почту и просто вызываю popToRoot при последнем просмотре... это выдаст мне ошибку «EXC_BAD_ACCESS», но я не получил ее в NSZombie:S   -  person Th3noon    schedule 09.08.2011
comment
Я запутался, как мне проверить, выпущен ли он? и как исправить, если это так..   -  person Th3noon    schedule 09.08.2011
comment
Наконец-то получил ответ :) Я храню информацию в делегате. После этого я отпустил .. Думаю, я не должен этого делать   -  person Th3noon    schedule 09.08.2011


Ответы (6)


[self.navigationController popToRootViewControllerAnimated: НЕТ];

person sairam    schedule 09.08.2011
comment
журнал консоли: 2011-08-09 13:24:40.196 MeldStad[5686:207] melding verzonden 2011-08-09 13:24:40.222 MeldStad[5686:207] count:1 2011-08-09 13:24:41.551 MeldStad[5686:207] ok Программа получила сигнал: «EXC_BAD_ACCESS». - person Th3noon; 09.08.2011

Закомментируйте строку кода, показанную ниже:

//  [self dismissModalViewControllerAnimated:YES];
person Vijay-Apple-Dev.blogspot.com    schedule 09.08.2011
comment
Та же проблема, но на этот раз в NSZombie приложение останется в MailComposer при нажатии кнопки отправки.. (зомби не размещены) Приложение закрывается при нажатии кнопки отправки более одного раза - person Th3noon; 09.08.2011
comment
тогда попробуйте переместить [self dismissModalViewControllerAnimated:YES]; перед блоком переключателей. Вы инициировали navController с помощью - (id)initWithRootViewController:(UIViewController *)rootViewController - person Michał Zygar; 09.08.2011
comment
Нет, не знаю, как запустить навигационный контроллер и где это сделать? Похоже, проблема не в mailcomposer (это также происходит, когда я вызываю poptoRoot вместо mailcomposer) - person Th3noon; 09.08.2011

У меня были проблемы с вызовом popToRootViewController:animated: в обратном вызове UIAlertView в iOS4 (но не в iOS5), поэтому вместо этого я разместил уведомление в обратном вызове, которое было получено одноэлементным классом, и одноэлементным вызовом с именем popToRootViewController:animated:

person lobianco    schedule 03.06.2012

Проверьте, есть ли у вас релиз или autorealease в ваших предыдущих ViewController (особенно в ViewController, который отправляет вас к последнему viewController) прямо перед

[self.navigationController pushViewController:yourViewController animated:YES];

У вас может быть что-то вроде:

vController = [[YourViewController alloc] initWithNibName:@"HighScoreViewController" bundle:nil] autorelease];

поэтому вам придется удалить автозапуск

person arniotaki    schedule 18.12.2013

С точки зрения сохранения приложения от сбоя этот фрагмент кода должен сделать это.

if([navigationController respondsToSelector:@selector(popToRootViewControllerAnimated:)]) {
            [navigationController popToRootViewControllerAnimated:NO];
}

Но все же нужно найти причину экрана, по которой навигационный контроллер не отвечает на селектор, чтобы при необходимости вызвать всплывающий контроллер корневого представления.

person Code Farmer    schedule 14.06.2018

Попробуйте [self popToRootViewControllerAnimated: NO];

person sairam    schedule 09.08.2011
comment
Подсказывает мне другую ошибку: причина «SIGABRT»: «-[MeldingOverzicht popToRootViewControllerAnimated:] нераспознанный селектор отправлен экземпляру - person Th3noon; 09.08.2011