2013-04-27 7 views
5

qui è il mio codice:iOS 6.1.2 - Perché UIAlertView non può essere ignorato? sfondo ancora sullo schermo

UIAlertView *someError = [[UIAlertView alloc] initWithTitle:nil message:@"Server Error!" delegate:nil cancelButtonTitle: @"ok" otherButtonTitles: nil]; 
[someError show]; 

Quando si tocca il pulsante OK, sullo sfondo avviso ancora lì, e mi toccare lo schermo, la barra di stato lampeggia.

ho trovato alcune risposte, ma non funzionano, ho cambiato il mio codice per:

dispatch_async(dispatch_get_main_queue(), ^{ 
     UIAlertView *someError = [[UIAlertView alloc] initWithTitle:nil message:@"Server Error!" delegate:nil cancelButtonTitle: @"ok" otherButtonTitles: nil]; 
     [someError show]; 
}); 

o impostare il delegato:

dispatch_async(dispatch_get_main_queue(), ^{ 
     UIAlertView *someError = [[UIAlertView alloc] initWithTitle:nil message:@"Server Error!" delegate:self cancelButtonTitle: @"ok" otherButtonTitles: nil]; 
     [someError show]; 
}); 

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [alertView dismissWithClickedButtonIndex:buttonIndex animated:NO]; 
    }); 

} 

ancora non funziona, allora provo a:

UIAlertView *someError = [[UIAlertView alloc] initWithTitle:nil message:@"error" delegate:nil cancelButtonTitle: @"ok" otherButtonTitles: nil]; 
[someError performSelectorOnMainThread:@selector(show) withObject:nil waitUntilDone:NO]; 

non funzionare, pazzo, questo non è un lavoro troppo:

[self performSelectorOnMainThread:@selector(showAlert:) withObject:@"error", nil) waitUntilDone:NO]; 

// the show Alert function 
-(void)showAlert:(NSString*)str 
{ 
    UIAlertView *someError = [[UIAlertView alloc] initWithTitle:nil message: str delegate: nil cancelButtonTitle: @"ok" otherButtonTitles: nil]; 
    [someError performSelectorOnMainThread:@selector(show) withObject:nil waitUntilDone:NO]; 
} 

non funziona ancora.

prima e dopo lo spettacolo di allarme:

before the alert showafter tap ok

risposta

3

Assicuratevi che il vostro controller della vista (o dove si sta creando il vostro UIAlertView da) ha "<UIAlertViewDelegate>" definito nella linea @interface. Per esempio:

@interface YellowViewController : UIViewController <UIAlertViewDelegate> 

Ora, quando si crea un UIAlertView dal controller della vista sottoclasse e impostare il delegato per sé, il controller vista dovrebbe conformarsi e dovrebbe ricevere i metodi di protocollo delegato.

La prossima cosa. Questo bit di codice è corretto per me:

dispatch_async(dispatch_get_main_queue(), ^{ 
     UIAlertView *someError = [[UIAlertView alloc] initWithTitle:nil message:@"Server Error!" delegate:self cancelButtonTitle: @"ok" otherButtonTitles: nil]; 
     [someError show]; 
}); 

Ma le chiamate metodo delegato stanno per accadere sul thread principale (che è dove tutta l'interfaccia utente accade):

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    [alertView dismissWithClickedButtonIndex:buttonIndex YES]; 
} 

In altre parole, sbarazzati del materiale di spedizione e vedi cosa succede. Poi di nuovo, :

Discussione

Il ricevitore è respinto automaticamente dopo questo metodo viene richiamato.

Pertanto, potrebbe non essere necessario eliminare esplicitamente la visualizzazione di avviso.

+0

Ho provato, ma non funziona anche, la casella di avviso è stata chiusa, ma lo sfondo nero è ancora sullo schermo come lo screenshot.Io ho NSlog nel delegato di alertView, è stato chiamato. Come posso rimuovere lo sfondo manualmente? – yellow

+0

Hmmmm ... se questo metodo delegato è nel tuo controller di visualizzazione, prova "[self becomeFirstResponder];" "dopo aver chiuso l'avviso. –

+0

Michael Dautermann, non funziona ancora ... non posso mostrare lo sfondo quando popup di avviso? – yellow

1

Tutte le cose di UIKit devono funzionare nel thread principale, assicurarsi che il tuo alertView sia chiamato nel thread principale. Inoltre, la vista che mostra l'avviso deve essere nella thread principale.

0

Ho ottenuto la soluzione per questo o piuttosto il problema per il quale si verifica questo scenario.Beh, sono in ritardo, ma sono sicuro che devi usare alcune librerie esterne per mostrare progressi come "SVProgressHUD" o "MBProgressHUD". Queste librerie giocano una grande quantità con quella della gerarchia WINDOW principale che di conseguenza causa problemi agli elementi dell'interfaccia utente nativi come UIAlertView o piuttosto Picker Controller ecc. L'unica via d'uscita a questo problema è provare a non utilizzare la libreria di terze parti che ho nominato sopra se . Allora tutto funziona bene. Anche per me è stata una cosa sciocca.

0

Beh, stavo soffrendo la stessa cosa. Ho provato tutto ma non ha funzionato. Ecco cosa ha funzionato per me, spero che lo troverai utile anche tu.

Scrivere un metodo delegato UIAlertView e inserire un punto di interruzione.

-(void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex 

Ora riprendi e noterai che l'effetto oscuro è scomparso. Quindi metti un ritardo di dire 0.5 secondi in questo delegato e si spera che il tuo problema sia risolto. Bene ha funzionato per me

Scrivere un metodo delegato UIAlertView e inserire un punto di interruzione.

[NSThread sleepForTimeInterval:0.5]; 
Problemi correlati