【问题标题】:Where Does A UIAlertView Live While Not DismissedUIAlertView 在没有被解雇的情况下生活在哪里
【发布时间】:2011-02-12 12:27:11
【问题描述】:

有谁知道活动的 UIAlertView 位于谁的子视图中,或者如何找到它正在运行的线程?

【问题讨论】:

    标签: iphone multithreading subview uialertview


    【解决方案1】:

    如果您转储windows property 的内容以及所有视图的所有子视图,您可以看到 UIAlertView 位于覆盖主窗口的单独窗口中。在这里,我有一个带有 viewcontroller 和 tableview 的导航栏(我删除了它的子视图,因为它们不相关)。

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

    【讨论】:

    • 谢谢,我去看看。顺便说一句,您是如何生成格式良好的转储的?
    • 这可以解决问题。在stackoverflow.com/questions/2528929/… -(BOOL)alertIsActive { for (UIWindow* window in [UIApplication sharedApplication].windows) { if ([window.subviews count] > 0) if ([[window.subviews objectAtIndex:0] isKindOfClass :[UIAlertView 类]]) 返回是; } 返回否; }
    • @progrmr + 1 不错的片段。我有一个问题。是否可以在其子视图中找到 locationServices 警报视图?到目前为止,您的代码片段适用于所有 UIAlertViews,除了 locationServices 警报。有什么帮助吗?
    • + 1 不错的 sn-p,@progrmr。感谢分享。
    【解决方案2】:

    从你描述的窗口和时间问题来看,听起来你应该实现alertView:didDismissWithButtonIndex:。您可以从该方法中触发您的后续代码。

    编辑:如果这不起作用,我会尝试在窗口确实保证消失后延迟执行 FB 的东西。

    【讨论】:

    • 好主意,但我已经尝试过了,问题仍然存在,即使使用动画 = NO。
    【解决方案3】:

    活动的 UIAlertView 位于一个单独的窗口 (_UIAlertOverlayWindow) 中。使用.windows property 找到它。

    整个 UI 在主线程中运行。

    【讨论】:

      猜你喜欢
      • 2011-02-12
      • 2020-03-28
      • 2015-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多