2013-04-27 5 views
5

hier ist mein Code:iOS 6.1.2 - Warum die UIAlertView nicht abgewiesen werden? Hintergrund nach wie vor auf dem Bildschirm

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

, wenn ich die OK-Taste, die Warnung Hintergrund immer noch da klopfen, und ich auf den Bildschirm tippen, wird die Statusleiste flackern.

ich einige Antworten gefunden, aber sie nicht arbeiten, ich meinen Code geändert:

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

oder den Delegierten festgelegt:

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]; 
    }); 

} 

es immer noch nicht funktioniert, dann versuche ich zu:

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

nicht funktionieren, verrückt, das ist nicht arbeiten:

[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]; 
} 

immer noch nicht funktionieren.

vor und nach dem Alarm zeigen:

before the alert showafter tap ok

Antwort

3

bestimmte Machen Sie Ihre View-Controller (oder wo auch immer Sie Ihre UIAlertView von erstellen) hat "<UIAlertViewDelegate>" in der @interface Linie definiert. Zum Beispiel:

@interface YellowViewController : UIViewController <UIAlertViewDelegate> 

Wenn Sie nun eine UIAlertView von Ihren Unterklasse-View-Controller erstellen und die Delegierten selbst gesetzt, Ihr View-Controller sollte entsprechen und sollte die Methoden delegiert Protokoll erhalten.

Nächste Sache. Dieses Stück Code sieht für mich richtig:

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

Aber Ihre Delegatmethode Anrufe werden auf dem Hauptthread passieren (das ist, wo alle UI geschehen):

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

Mit anderen Worten, befreie das Versandmaterial und sieh, was passiert. Dann wieder, :

Diskussion

Der Empfänger wird automatisch entlassen, nachdem diese Methode aufgerufen wird.

Sie müssen die Warnmeldungsansicht daher möglicherweise nicht explizit schließen.

+0

Ich habe versucht, aber nicht funktioniert auch, die Alarmbox ist entlassen, aber der schwarze Hintergrund immer noch auf dem Bildschirm wie der Screenshot.I haben NSLog in alertView Delegat, es wurde aufgerufen. Wie kann ich den Hintergrund manuell entfernen? – yellow

+0

Hmmmm ... Wenn diese Delegate-Methode in Ihrem View-Controller ist, versuchen Sie "' [self werdenFirstResponder]; '", nachdem Sie Ihre Warnung geschlossen haben. –

+0

Michael Dautermann, es funktioniert immer noch nicht ... kann ich den Hintergrund nicht anzeigen, wenn das Popup-Fenster alert ist? – yellow

1

Alle UIKit Zeug muss im Haupt-Thread arbeiten, stellen Sie sicher, dass Ihre AlertView im Haupt-Thread aufgerufen werden. Außerdem muss die Ansicht, die Ihre Warnung anzeigt, im Hauptthread sein.

0

Ich habe die Lösung für dieses oder vielmehr das Problem, für das dieses Szenario auftritt.Nun, ich bin spät, aber ich bin sicher, dass Sie einige externe Bibliotheken verwenden müssen, um Fortschritte wie "SVProgressHUD" oder "MBProgressHUD" zu zeigen. Diese Bibliotheken spielen eine große Rolle mit der der Haupt-WINDOW-Hierarchie, was zu Problemen bei nativen UI-Elementen wie UIAlertView oder Picker-Controller usw. führt. Die einzige Möglichkeit, dieses Problem zu umgehen, ist, die oben genannte Bibliothek nicht zu verwenden . Alles funktioniert dann gut. Es war für mich auch eine kopflose dumme Sache.

0

Nun war ich die gleiche Sache zu leiden. Ich habe alles versucht, aber nicht funktioniert. Hier ist, was für mich funktioniert hat, hoffentlich finden Sie es auch hilfreich.

ein UIAlertView Delegatmethode schreiben und einen Haltepunkt in sie.

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

Jetzt fortsetzen und Sie werden feststellen, dass der Dim-Effekt verschwunden ist. Also setze eine Verzögerung von etwa 0.5 Sekunden in diesen Delegierten und hoffentlich ist dein Problem gelöst. Nun, es ist für mich gearbeitet

ein UIAlertView Delegatmethode schreiben und einen Haltepunkt in sie.

[NSThread sleepForTimeInterval:0.5]; 
Verwandte Themen