【问题标题】:Iphone - UIView not displayedIphone - UIView 不显示
【发布时间】:2010-04-21 09:32:48
【问题描述】:

我的 UIView 有一个奇怪的问题:

我想显示我使用 Interface Builder 创建的活动指示器视图,以指示长时间运行的活动。

在我的主要 viewController 的 viewDidLoad 函数中,我像这样初始化 ActivityIndi​​cator 视图:

- (void)viewDidLoad {
    [super viewDidLoad];
    appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];        
    load = [[ActivityIndicatorViewController alloc] init];
    ...

当我按下按钮时,它会调用此 IBAction:

- (IBAction)LaunchButtonPressed{            
    // Show the Activity indicator view.
    [self.view addSubview:load.view];

    // eavy work 
    [self StartWorking];    

    // Hide the loading view.
    [load.view removeFromSuperview];    
}

在 StartWorking 函数中,我向 Internet 服务器发出请求并解析它返回给我的 XML 文件。

问题是,如果我调用我的 StartWorking 函数,应用程序不会通过显示 Activity Indicator 视图而是通过 StartWorking 函数启动。 而如果我删除对 StartWorking 函数的调用,则会显示视图。

有人能解释一下为什么吗? :s

【问题讨论】:

  • 是延迟显示视图还是根本不显示视图?
  • 视图显示延迟一些。

标签: iphone activity-indicator


【解决方案1】:

您是否尝试过在不同的线程上调用 StartWorking 方法?
也许它繁重的过程会阻止其他指令的发生。

查看NSThread类,尤其是detachNewThreadSelector:toTarget:withObject:方法。

编辑:关于池问题,如果在不同的线程上调用它,您需要在 StartWorking 方法中创建一个池:

- ( void )StartWorking
{
    NSAutoreleasePool * pool = [ [ NSAutoreleasePool alloc ] init ];

    /* Code here... */

    [ pool release ];
}

【讨论】:

  • 它工作正常,但我所有的自动释放对象都在泄漏,因为没有适当的池。 :s
  • 你应该小心在线程中做东西(重功能)。我通常更喜欢在线程中实现轻量级函数,而让重的函数在主线程中。
【解决方案2】:

替换: [self.view addSubview:load.view];

与: [self performSelector:@selector(addLoadingSubview) afterDelay:0.1f];

并创建方法: -(void)addLoadingSubview{[self.view addSubview:load.view];}

【讨论】:

  • 我试过了,但结果是一样的。我用过:[self performSelector:@selector(ShowActivityIndi​​catorView) withObject:nil afterDelay:0.1f];
【解决方案3】:

好的,我找到了基于 santoni 答案的解决方案:

- (IBAction)LaunchButtonPressed{            
    // Show the Activity indicator view.
    [self performSelector:@selector(ShowActivityIndicatorView) withObject:nil afterDelay:0];

    // eavy work 
    [self performSelector:@selector(StartWorking) withObject:nil afterDelay:2];  

    // Hide the loading view.
    [load.view removeFromSuperview];    
}

活动指示器视图在调用 eavy 函数之前显示。

感谢您的回答。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    • 1970-01-01
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多