2010-04-26 9 views

Odpowiedz

18

Jeśli zrzucisz zawartość windows property i wszystkich subskrybentów wszystkich widoków, zobaczysz, że UIAlertView znajduje się w osobnym oknie, które nakłada się na główne okno. Tutaj mam navbar z viewcontroller i tableview (usunąłem jego subviews, ponieważ nie są relevent).

<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>> 

Oto kod, który generuje zrzut. Uważam, że to użyteczne przy okazji, aby zobaczyć co się dzieje, gdy coś nie robi czego oczekuję:

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: "); 
    } 
} 
+0

Dzięki, będę wyglądać. BTW, jak udało ci się stworzyć ładne sformatowane dump? –

+1

To działa. Okazało się, że pomysł w http://stackoverflow.com/questions/2528929/iphone-sdk-check-if-a-uialertview-is-showing - (BOOL) alertIsActive { \t dla (UIWindow * okna [UIApplication sharedApplication] .windows) { \t \t jeżeli [ile window.subviews] (> 0) \t \t \t if ([[window.subviews objectAtIndex: 0] isKindOfClass [UIAlertView klasa]]) \t \t \t \t return YES; \t} \t return NO; } –

+0

Bardzo przydatny fragment - dzięki za udostępnienie @progrmr – Till

4

Aktywny UIAlertView żyje w osobnym oknie (_UIAlertOverlayWindow). Użyj .windows property, aby go znaleźć.

Cały interfejs użytkownika działa w głównym wątku.

1

Od który opisujesz z oknami i czasu problemu, brzmi jak należy wdrożyć alertView:didDismissWithButtonIndex:. Możesz wywołać swój kod kontrolny z tej metody.

EDIT: jeśli to nie działa, chciałbym spróbować zrobić opóźnienie do wykonania rzeczy FB z opóźnieniem, gdy okno jest naprawdę gwarancją pewności nie ma.

+0

Dobry pomysł, ale próbowałem to i problem nie zniknie, nawet animowany = NIE. –

Powiązane problemy