Weiß jemand, in wessen Unteransicht sich ein aktives UIAlertView befindet oder wie man den Thread findet, in dem es läuft?Wo lebt eine UIAlertView, während sie nicht abgewiesen wird
Antwort
Wenn Sie den Inhalt der windows property und aller Unteransichten aller Ansichten ablegen, können Sie sehen, dass sich die UIAlertView in einem separaten Fenster befindet, das das Hauptfenster überlagert. Hier habe ich eine Navbar mit einem Viewcontroller und einer Tabellenansicht (ich habe die Subviews entfernt, weil sie nicht relevant sind).
<UIWindow: 0x411fd50; frame = (0 0; 320 480); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x4120af0>>
: <UILayoutContainerView: 0x4123310; frame = (0 0; 320 480); autoresize = W+H; layer = <CALayer: 0x411f800>>
: | <UINavigationTransitionView: 0x4123500; frame = (0 0; 320 480); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x41232e0>>
: | : <UIViewControllerWrapperView: 0x4519d30; frame = (0 64; 320 416); autoresize = W+H; layer = <CALayer: 0x4519a40>>
: | : | <UITableView: 0x7808000; frame = (0 0; 320 416); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x45182a0>>
: | <UINavigationBar: 0x45018b0; frame = (0 20; 320 44); clipsToBounds = YES; autoresize = W; layer = <CALayer: 0x4500fe0>>
: | : <UINavigationItemView: 0x4522a20; frame = (100 8; 160 27); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x4526310>>
: | : <UINavigationItemButtonView: 0x45230a0; frame = (5 7; 87 30); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x4520260>>
<_UIAlertOverlayWindow: 0x4179b70; frame = (0 0; 320 480); opaque = NO; layer = <CALayer: 0x4188dc0>>
: <UIAlertView: 0x4194bc0; frame = (3.8 161.95; 312.4 177.1); transform = [1.1, 0, 0, 1.1, 0, 0]; opaque = NO; animations = { transform=<CABasicAnimation: 0x4191160>; opacity=<CABasicAnimation: 0x41226f0>; }; layer = <CALayer: 0x4144c30>>
: | <UILabel: 0x4177e70; frame = (12 15; 260 23); text = 'Name of Date'; clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x4179370>>
: | <UILabel: 0x418b100; frame = (12 45; 260 41); text = 'Name of the date that you...'; clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x4128450>>
: | <UIThreePartButton: 0x41942a0; frame = (11 102; 262 43); opaque = NO; tag = 1; layer = <CALayer: 0x4191f30>>
Hier ist der Code, der den Dump erzeugt. Ich fand es gelegentlich nützlich, um zu sehen, was los ist, wenn etwas nicht zu tun, was ich erwarten:
void dumpView(UIView* aView, NSString* indent) {
if (aView) {
NSLog(@"%@%@", indent, aView); // dump this view
if (aView.subviews.count > 0) {
NSString* subIndent = [[NSString alloc] initWithFormat:@"%@%@",
indent, ([indent length]/2)%2==0 ? @"| " : @": "];
for (UIView* aSubview in aView.subviews) dumpView(aSubview, subIndent);
[subIndent release];
}
}
}
void dumpWindows() {
for (UIWindow* window in [UIApplication sharedApplication].windows) {
dumpView(window, @"dumpView: ");
}
}
Der aktive UIAlertView befindet sich in einem separaten Fenster (_UIAlertOverlayWindow). Verwenden Sie .windows
property, um es zu finden.
Die gesamte Benutzeroberfläche wird im Hauptthread ausgeführt.
Von dem Problem, dass Sie mit Fenstern und Timing beschreiben, klingt wie Sie alertView:didDismissWithButtonIndex: implementieren sollten. Sie können Ihren Folgecode innerhalb dieser Methode auslösen.
EDIT: wenn das nicht funktionierte, würde ich versuchen, eine Verzögerung zu machen, um die FB-Sachen nach einer Verzögerung auszuführen, wenn das Fenster wirklich garantiert weg ist.
Gute Idee, aber ich habe das ausprobiert und das Problem besteht auch bei animiertem = NEIN. –
Danke, ich werde es mir ansehen. BTW, wie hast du den schön formatierten Dump erstellt? –
Das macht den Trick. Fand die Idee in http://stackoverflow.com/questions/2528929/iphone-sdk-check-if-a-uialertview-is-showing - (BOOL) alertIsActive { \t für (UIWindow * Fenster in [UIApplication shared] .Windows) { \t \t if ([window.subviews count]> 0) \t \t \t if ([[window.subviews objectAtIndex: 0] isKindOfClass: [UIAlertView Klasse]]) \t \t \t \t Rückgabe JA; \t} \t zurücksenden NO; } –
Sehr handliches Snippet - Danke für die Freigabe @progrmr – Till