2011-12-31 75 views
1

我一直在研究这几天,但没有发现我的作品。IPhone UIActivityIndi​​cator将不会显示,直到过程完成

下面是所需的过程:用户在弹出窗口上按下Enter按钮 - > ActivityIdicator出现 - >保存过程发生 - > ActivityIndi​​cator消失。

但是,由于某些原因,ActivityIndi​​cator只有在该过程完成后才显示出来,使其完全无用。

我试图遵循此处介绍的过程:UIActivityIndicator not working properly?

下面是弹出窗口

-(void)alertView:(UIAlertView *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { 
    // the user clicked one of the Enter/Cancel buttons 
    [self performSelector:@selector(DisplaySpinner) withObject:nil afterDelay:0]; 
    if (buttonIndex == 1) 
    { 
     [self performSelector:@selector(EnterButtonClicked) withObject:nil afterDelay:0]; 
    } 
    else 
    { 
     NSLog(@"Name Cancel Clicked"); 
    } 
    [NameField resignFirstResponder]; 
    } 

下面的代码是为DisplaySpinner方法的代码:

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

    [self.view addSubview:loadingIndicator]; 
    [loadingIndicator startAnimating]; 

    [pool release]; 
} 

EnterButtonClicked方法包含保存过程。尽管在单独的进程中运行,但ActivityIndi​​cator只有在该过程完成后才会显示。

有什么建议吗?

+0

后续流程完成后,你知道吗? – 2011-12-31 15:44:52

+0

那是“NSLog”在那个方法? – 2011-12-31 15:45:16

+0

@ DineshRaja.MaG过程完成后,我确实得到它。是的,这是,但它与问题无关(我认为)。 – USS1994 2011-12-31 16:11:35

回答

3

该应用程序不会更新屏幕以显示UIActivityIndicatorView,直到主运行循环重新获得控制权。如果您的处理任务阻塞了主线程,那么在完成之前将不会发生UI更新。你应该做异步处理。

发生旋转事件时,在主运行循环中一次调用willRotate...willAnimateRotation...方法。因此,您在显示活动指示符之前先阻止该方法。

要做到这一点,您需要将方法任务推送到另一个线程。该方法会在工作完成时回调到该视图控制器,以便更新视图。我会放在willAnimateRotation...方法中显示活动指标。

您需要做的是强制UIActivityIndicatorView开始显示,即使运行循环不会结束。一种方式是 -

[self performSelector:@selector(animation) withObject:nil afterDelay:0] 

-(void)startSpinner 
{ 
    NSAutoreleasepool *pool = [[NSAutorepleasepool alloc]init]; 
    [indicatorView startAnimating]; 
    [pool release]; 
} 

所以基本上,performSelector设置一个计时器上当前线程的run loop执行animation消息。计时器配置为以默认模式运行(NSDefaultRunLoopMode)。当定时器触发时,线程将尝试从运行循环中出列消息并执行选择器。如果运行循环运行并处于默认模式,则成功;否则,定时器会等待,直到运行循环处于默认模式。

请注意,指定延迟0不一定会导致选择器立即执行。选择器仍然在线程的运行循环中排队并尽快执行。

+0

对不起,我有点困惑:虽然我明白你在说什么,而不是使用异步过程,但我不确定你想要做什么。你是否覆盖ActivityIndi​​catorView的方法? – USS1994 2011-12-31 16:16:59

+0

其实我写的是黑客。经过多一点研究后,您最好使用'performSelector'来启动您的animationSpinner,因为它会立即调用runloop中的动画。检查你我的更新答案。告诉我,如果它有帮助... – 2011-12-31 16:23:40

+0

这对我来说是有道理的,但是这不是我尝试过的吗?由于某种原因,它不起作用。或者我只是不正确地实施它? – USS1994 2011-12-31 16:35:52

相关问题