Где находится UIAlertView, пока его не закрыли

Кто-нибудь знает, в чьем подпредставлении находится активный UIAlertView или как найти поток, в котором он работает?


person Jim B    schedule 26.04.2010    source источник


Ответы (3)


Если вы сбросите содержимое свойство windows и все подпредставления всех представлений, вы можете видеть, что UIAlertView находится в отдельном окне, которое перекрывает главное окно. Здесь у меня есть панель навигации с контроллером представления и табличным представлением (я удалил его подпредставления, поскольку они неуместны).

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

Вот код, который производит дамп. Иногда мне было полезно посмотреть, что происходит, когда что-то идет не так, как я ожидал:

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: ");
    }   
}
person progrmr    schedule 26.04.2010
comment
Спасибо, посмотрю. Кстати, как вы создали красивый отформатированный дамп? - person Jim B; 26.04.2010
comment
Это помогает. Нашел идею в stackoverflow.com/questions/2528929/ - (BOOL) alertIsActive {для (UIWindow * window в [UIApplication sharedApplication] .windows) {if ([window.subviews count] ›0) if ([[window.subviews objectAtIndex: 0] isKindOfClass: [класс UIAlertView]]) вернуть ДА; } вернуть NO; } - person Jim B; 27.04.2010
comment
@progrmr + 1 Хороший сниплет. Но у меня есть один вопрос. Можно ли узнать, в чьей части находится представление предупреждений locationServices? Ваш сниплет работает для всех UIAlertViews, кроме предупреждения locationServices. Любая помощь, пожалуйста? - person Just a coder; 29.07.2012
comment
+ 1 Хороший сниппет, @progrmr. Спасибо, что поделился. - person Joe M; 04.09.2013

Активный UIAlertView находится в отдельном окне (_UIAlertOverlayWindow). Используйте _ 1_ свойство, чтобы найти его.

Весь пользовательский интерфейс выполняется в основном потоке.

person kennytm    schedule 26.04.2010

Судя по описанной вами проблеме с окнами и временем, вы должны реализовать alertView: didDismissWithButtonIndex:. Вы можете запустить свой последующий код из этого метода.

РЕДАКТИРОВАТЬ: если это не сработало, я бы попытался сделать задержку для выполнения материала FB после задержки, когда окно действительно гарантированно исчезнет.

person Jaanus    schedule 26.04.2010
comment
Хорошая идея, но я пробовал это, и проблема не устранена даже с анимированным = NO. - person Jim B; 26.04.2010