Pergunta

Eu estou tentando exibir uma visão modal reta após o outro ponto de vista foi apresentado de forma modal (o segundo é uma visão de carregamento que aparece).

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    // Show load
    LoadViewController *loader = [[LoadViewController alloc] init];
    [self presentModalViewController: loader animated:NO];
    [loader release];
}

Mas quando eu fizer isso eu recebo um "Programa de sinal recebido: 'EXC_BAD_ACCESS'." erro.

O rastreamento de pilha é:

0  0x30b43234 in -[UIWindowController transitionViewDidComplete:fromView:toView:]
1  0x3095828e in -[UITransitionView notifyDidCompleteTransition:]
2  0x3091af0d in -[UIViewAnimationState sendDelegateAnimationDidStop:finished:]
3  0x3091ad7c in -[UIViewAnimationState animationDidStop:finished:]
4  0x0051e331 in run_animation_callbacks
5  0x0051e109 in CA::timer_callback
6  0x302454a0 in CFRunLoopRunSpecific
7  0x30244628 in CFRunLoopRunInMode
8  0x32044c31 in GSEventRunModal
9  0x32044cf6 in GSEventRun
10 0x309021ee in UIApplicationMain
11 0x00002154 in main at main.m:14

Todas as idéias? Eu estou totalmente perplexo! A visão de carregamento é vazio, então há definitivamente nada acontecendo lá dentro que está causando o erro. É algo a ver com o lançamento de 2 visualizações modal no mesmo ciclo de eventos ou algo assim?

Obrigado,

Mike

Edit: Muito estranho ... Eu modifiquei um pouco para que o ponto de vista de carregamento é mostrada após um pequeno atraso, e esta multa funciona! Assim, parece ser algo dentro do mesmo ciclo de eventos!

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    // Show load
    [self performSelector:@selector(doit) withObject:nil afterDelay:0.1];
}

- (void)doit {
    [self presentModalViewController:loader animated:YES];  
}
Foi útil?

Solução

Eu modifiquei um pouco para que o ponto de vista de carregamento é mostrada após um pequeno atraso, e esta multa funciona! Assim, parece ser algo dentro do mesmo ciclo de eventos!

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    // Show load
    [self performSelector:@selector(doit) withObject:nil afterDelay:0.1];
}

- (void)doit {
    [self presentModalViewController:loader animated:YES];  
}

Outras dicas

Acredito que reproduziu o mesmo erro no iOS 4. Na minha aplicação, o acidente ocorreu de forma consistente ao tentar mostrar uma segunda vista modal imediatamente depois de mostrar uma visão em primeira modal. Lutei para um insano indo algumas horas.

Depois de ler as mensagens nesta discussão, eu tentei criar um exemplo reproduzível simples usando o modelo Tab Bar Aplicação. Eu era capaz de usar o UIImagePickerController para mostrar a primeira vista modal depois de responder a um clique de botão em "FirstViewController.m". Quando eu tentei mostrar o UIImagePickerController novamente (depois de manusear a mensagem imagePickerControllerDidCancel), a aplicação deixou de funcionar com o mesmo erro.

No dispositivo, simplesmente não havia indício o que estava acontecendo. No entanto, quando eu corri o código do simulador, eu estava bastante sorte para conseguir esta mensagem no console:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Attempting to begin a modal transition from to while a transition is already in progress. Wait for viewDidAppear/viewDidDisappear to know the current transition has completed'

Assim, parece que minha única opção é seguir o conselho da mensagem de erro e simplesmente esperar até viewDidAppear (usando um sinalizador para indicar que eu sou neste modo especial) e, em seguida, carregar o segundo ponto de vista modal.

Aqui está o rastreamento de pilha completo para a completude:

** Call stack at first throw:
(
 0   CoreFoundation                      0x0238c919 __exceptionPreprocess + 185
 1   libobjc.A.dylib                     0x024da5de objc_exception_throw + 47
 2   CoreFoundation                      0x02345078 +[NSException raise:format:arguments:] + 136
 3   Foundation                          0x000ab8cf -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 116
 4   UIKit                               0x00544317 -[UIWindowController transition:fromViewController:toViewController:target:didEndSelector:] + 212
 5   UIKit                               0x0035c769 -[UIViewController presentModalViewController:withTransition:] + 2937
 6   TestTempDelete                      0x000021cf -[FirstViewController showImagePicker] + 167
 7   Foundation                          0x0002fcea __NSFireDelayedPerform + 441
 8   CoreFoundation                      0x0236dd43 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 19
 9   CoreFoundation                      0x0236f384 __CFRunLoopDoTimer + 1364
 10  CoreFoundation                      0x022cbd09 __CFRunLoopRun + 1817
 11  CoreFoundation                      0x022cb280 CFRunLoopRunSpecific + 208
 12  CoreFoundation                      0x022cb1a1 CFRunLoopRunInMode + 97
 13  GraphicsServices                    0x02bf12c8 GSEventRunModal + 217
 14  GraphicsServices                    0x02bf138d GSEventRun + 115
 15  UIKit                               0x002beb58 UIApplicationMain + 1160
 16  TestTempDelete                      0x00001eb4 main + 102
 17  TestTempDelete                      0x00001e45 start + 53

Espero que isso ajude.

** Como foi dito anteriormente, use isIgnoringInteractionEvents

//Check if the app is ignoring interatctions, if so, add a delay for 1 sec
if([[UIApplication sharedApplication] isIgnoringInteractionEvents]==TRUE) {
        [currentViewController performSelector:@selector(presentModalViewController:animated:) withObject:screen afterDelay:1];
    } else {
        [currentViewController presentModalViewController:screen animated:YES];
    }

É possível se você está recebendo este depois de clicar em um botão que estava ligado ao seu código no Interface Builder, que você tem duas ações ligadas a um botão (talvez se você tivesse uma visão modal ligada a um botão, em seguida, duplicou o botão e ligada outra visão modal). Isto irá tentar demiti-los ambos fora e, portanto, ele vai falhar com essa mensagem.

Eu encontrei a mesma exceção

Terminar aplicativo devido a exceção não capturada 'NSInternalInconsistencyException', razão: 'A tentativa de começar uma transição modal de para com uma transição já está em andamento. Espere por viewDidAppear / viewDidDisappear conhecer a atual transição foi concluída '

Como sugerido anteriormente Tentei atrasar apresentando uma transição modal, mas isso realmente não ajuda. Então eu descobri que eu tinha vários IBActions ligados ao evento TouchUpInside do meu botão !!! . No meu caso dois IBActions iria começar: apresentar um seletor de pessoas de forma modal e apresentando um selecionador de imagem de forma modal. Isso explica a mensagem de erro. Verifique se você tem vários IBActions contacto!

Seu problema é mais provável no método que inits e apresenta o método que viewDidAppear é em, ou em init / viewDidLoad / método viewWillAppear de LoadViewController.

Set alguns break points e siga até acidente ...

Eu tive um erro semelhante ao clicar em um UIButton para abrir uma Modal View. Mudei o ouvinte UIButton's de UIControlEventAllEvents para UIControlEventTouchUpInside. Basicamente, foi disparar o Modal Vista em Touch Down Inside e, em seguida, novamente em Touch Up Inside.

Eu tive o mesmo problema devido a incompatibilidade entre nomes

HelpViewController *controller = [[HelpViewController alloc] initWithNibName:@"HelpView" bundle:nil];

eo nome do arquivo .xib real.

Eu acho que esta questão tem algo a ver com um problema que eu também encontrou. É muito fácil de reproduzir:

Criar novo projeto Xcode "Utilitário de Aplicação". No FlipsideViewController.m você acabou de inserir o seguinte método:

- (void)viewDidAppear:(BOOL)animated {
  [super viewDidAppear: animated];
  [self showInfo];
}

Se você fizer isso, inicie o aplicativo, em seguida, o outro lado-view será ativado direita longe. Assim que você pressiona o botão "Concluído" no flipside-view, você vai voltar ao MAINVIEW que dispara viewDidAppear e volta à direita para a flipside- Visão. Assim que o flipside-view é exibido, o aplicativo pára - sem memória desalocadores são chamados -. é como você ter pressionado o botão home

Quando eu estava usando algumas propriedades adicionais nos pontos de vista, eu também tenho a exceção, então eu despojado o código para a quantidade mínima ...

Eu realmente não tenho idéia, o que este problema realmente é ...

Com os melhores cumprimentos, Tobias

É realmente depende do que as rotinas de suporte para viewDidAppear estão fazendo. Por exemplo, se presentModalViewController:animated: não retém loader o acidente pode ser devido ao UIWindowController tentando falar sobre loader que já foi lançado (no final da rotina que você postou).

Eu tive um problema semelhante ao usar a mesma técnica que você implementar uma visão de carregamento. Ele deixaria de funcionar quando a vista de carga foi demitido no final da carga. No meu caso, o problema veio do fato de que, assim como a visão de carga foi demitido viewDidAppear foi chamado novamente e tentou apresentar o ponto de vista de carregamento novamente, o que presumivelmente provocado o acidente. Eu fixo-lo simplesmente, verificando se o ponto de vista de carregamento tinha sido apresentado antes:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    if(needDisplayLoader)
        [self presentModalViewController: loader animated:NO];
}

Então eu definir needDisplayLoader para NO antes de afastar a vista carregador

Espero que isso ajude ...

Eu corri para este problema agora, e corrigiu-lo usando o seletor: afterDelay sugestão acima. Só para acrescentar, eu compilado (sem a correção) sob iPhone OS 4.0 beta, e NO CRASH! Assim, o erro no XCode parece ter sido corrigido na próxima gen. Não que isso faz qualquer um de nós qualquer bom hoje, mas, apenas para que todos sabem, que realmente foi um bug no Xcode e não necessariamente qualquer coisa que estávamos fazendo errado em nossas estilos de codificação.

Tive mesmo problema exato. Resolvido com o acima sugerido ...

[self performSelector:@selector(doit) withObject:nil afterDelay:0.5];

teve de utilizar uma demora 0,5 seg. Possivelmente porque eu estava realizando presentModalViewController diretamente depois de um modal UIPickerViewController.

Eu apenas tive este problema e descobriu-se que o meu problema era porque eu era dealloc meu delegado protocolo.

Penso que a razão para o loop é que o novo controlador de vista em que se a carga tem um método viewDidAppear por padrão e tem

[super viewDidAppear animated];

que significa que vai chamar de volta para viewDidAppear seu principal do controlador de vista de novo, como que ele vai em um loop

em viewcontroller você está apresentando ter um método como este, sem super-viewdidapper:

-(void)viewDidAppear:(BOOL)animated{
    //[super viewDidAppear:animated]; no super

}

EXC_BAD_ACCESS é um erro de memória. Você provavelmente está tentando usar um objeto que já foi liberado / desalocada. Essa resposta dá algumas dicas para depurar esses problemas:

Depuração EXC_BAD_ACCESS

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top