27 Jan, 2011 20:31

UIAlertView x UIWindow

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    if (buttonIndex == 1)
        [minhaView exibir];
}

Fizemos vários testes para saber o porquê da view sumir. Testamos para ver se realmente a view continuava adicionada, testamos se ninguém escondia a view, e vários outros testes. Todos mostravam que a view estava ali, não escondida (ou seja, hidden = NO), porém não visível na tela.

Aí, tivemos a ideia de testar fora do delegate da UIAlertView. Simplesmente funcionou! A view não sumia mais. Então estava óbvio que o problema era adicionar a view na window dentro do delegate.

Voltamos a adicionar a view no delegate, contudo, mandamos imprimir quais windows existiam no projeto. E para a nossa supresa, vimos que a UIAlertView possuia a sua própria window, ou seja, quando adicionávamos a view na keyWindow, nesse momento ela apontava para a window da UIAlertView e não da aplicação, como desejávamos. Era por isso que a view sumia.

Depois disso, forçamos a adição da view na window da aplicação dentro do delegate e funcionou!

@implementation MinhaView
- (void)exibir {
    if (self.windowPadrao)
        [self.windowPadrao addSubView:self];
    else
        [[[UIApplication shareApplication] keyWindow] addSubview:self];
}
@end

// A chamada da view
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    if (buttonIndex == 1) {
        minhaView.windowPadrao = self.window;
        [minhaView exibir];
    }
}

Fica aí a dica para que desenvolvedores não passem pelo mesmo problema que passamos aqui. Até!

Ao navegar neste site, você consente o uso de cookies nossos e de terceiros, que coletam informações anônimas e são essenciais para melhorar sua experiência em nosso site.