2010-11-22 8 views
9

Estoy trabajando en una aplicación donde aparece un UIAlert la primera vez que el usuario comienza a usarlo para preguntar si desea utilizar su ubicación actual. Esto sucede dentro del controlador principal. Sin embargo, me sale el siguiente error cuando se utiliza el UIAlert:wait_fences: error al recibir la respuesta: 10004003 error - UIAlert SIN UITExtField presente

wait_fences: failed to receive reply: 10004003 

I depurado, y googled alrededor. No estoy usando una entrada de texto ni de teclado, así que no tengo que renunciar a un primer respondedor. Sin embargo, todavía no puedo entender por qué recibiría este error. Solo aparece cuando agrego el UIAlert.

MainController.m 

- (void)viewDidLoad { 

    UIAlertView *mainAlert = [[UIAlertView alloc] 
         initWithTitle:@"Location" 
         message:@"Do you wish to use your current location?" 
         delegate:self 
         cancelButtonTitle:nil 
         otherButtonTitles:@"No Thanks", @"Sure!", nil]; 

    [mainAlert show]; 
    [mainAlert release]; 

    [super viewDidLoad]; 
} 

El archivo de cabecera se construye así:

@interface MainController : UIViewController 
<CLLocationManagerDelegate, 
MKReverseGeocoderDelegate, UIAlertViewDelegate> 

Respuesta

8

He resuelto este problema mediante la adición de un ligero retraso a la UIAlert: El abajo es dentro de mi viewDidLoad método (que también funciona bien dentro de ViewDidAppear):

[self performSelector:@selector(testAlert) withObject:nil afterDelay:0.1]; 

por alguna razón que la demora hizo el truco. Entonces llamé a otro método (Voy a cambiar su nombre por supuesto ..):

- (void) testAlert 
{ 
    UIAlertView *mainAlert = [[UIAlertView alloc] initWithTitle:@"Location" message:@"Do you wish to use your current location?" delegate:self cancelButtonTitle:nil otherButtonTitles:@"No Thanks", @"Sure!", nil]; 

    [mainAlert show]; 
    [mainAlert release]; 
} 
0

Trate muestra la UIAlert en -viewDidAppear: (BOOL) animado. -viewDidLoad se invoca cuando se carga su vista, pero antes de que aparezca en la pantalla.

+0

Alan, probé esto ...moví el código a la función viewDidAppear y todavía estoy recibiendo el mismo mensaje de error. – squeezemylime

+0

Creo que se está produciendo este error porque está mostrando UIAlertView antes de que se realicen las animaciones de navegación. ¿Estás llamando [super viewDidAppear: animated] primero? –

1

Siempre llame [super viewDidLoad]; antes de hacer cualquier otra cosa. Eso también explica por qué el retraso funciona.

Espero que tenga razón. :)

17

El motivo de este wait_fences: failed to receive reply: también puede ser que intente mostrar una alerta sin estar en el mainThread (que es el hilo de la GUI).

Despacho al hilo GUI ayuda:

dispatch_async(dispatch_get_main_queue(), ^{ 
    [mainAlert show]; 
}); 
+0

¿Cómo crees que no está en el hilo principal? viewDidLoad siempre se llama en el hilo principal. – TomSwift

0

que tenía un problema similar. Estaba agregando un observador en ViewDidLoad para una notificación de accesibilidad, que se publicó antes de que ViewDidAppear finalizara.

Así que ViewController estaba tratando de mostrar un UIAlertView antes de que su propia vista se dibujara por completo.

Moví la adición de observadores a ViewDidAppear y comencé el startNotifier de accesibilidad en ViewDidAppear. Además, la llamada a [super viewDidAppear] se perdió del código. Ambos problemas se corrigieron, la aplicación volvió a funcionar bien nuevamente.

Si obtiene esto wait_fences: error al recibir la respuesta: error 10004003 una vez, es posible que no pueda presentar ningún ViewControllers modal en la aplicación. Este era el problema que tenía en mi aplicación. A veces, al intentar presentar un ViewController modal, la aplicación entraría en un ciclo infinito.

Como dijo Alan, siempre recuerde "Intente mostrar el UIAlert en -viewDidAppear: (BOOL) animado. -viewDidLoad se invoca cuando su vista está cargada, pero antes de que aparezca en la pantalla".

Cuestiones relacionadas