如何按下按钮上传下一个视图或webview时显示活动指示器?

时间:2011-07-26 11:25:34

标签: objective-c ios xcode uiview uiwebview

My first view is looks like  this 当我点击按钮哪个标题点击这里放大然后我想在第一个视图上显示活动指示器并在加载此视图时删除。 second view in which image is upload from URL in image view.

但是我回去然后显示活动指示器,在此视图中显示。 first view with activity indicator

在第一个vie .m文件中,我已使用此代码进行操作。

-(IBAction)btnSelected:(id)sender{
UIButton *button = (UIButton *)sender;
int whichButton = button.tag;
NSLog(@"Current TAG: %i", whichButton);
UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
[spinner setCenter:CGPointMake(160,124)]; 
[self.view addSubview:spinner]; 
[spinner startAnimating];

if(whichButton==1)
{
    [spinner stopAnimating];

    first=[[FirstImage alloc]init];
    [self.navigationController pushViewController:first animated:YES];
    [spinner hidesWhenStopped ];

        }} 

在上面的代码我有按钮动作,我在其中调用下一个视图。现在我想在查看上传时显示/显示活动指示器。在下一个视图中,我有一个图像视图,其中我上传的图像我已经声明了一个也不起作用的活动指示器。怎么样?

3 个答案:

答案 0 :(得分:8)

Toro的建议提供了很好的解释和解决方案,但我只想提供另一种方法来实现这一目标,因为这就是我的工作方式。

正如托罗所说,

- (void) someFunction
{
    [activityIndicator startAnimation];

    // do computations ....

    [activityIndicator stopAnimation];  
}

上述代码无效,因为当您在当前运行的函数中包含activityIndi​​cator时,不会给UI时间更新。所以我和其他许多人所做的就是把它分成一个单独的线程,如下所示:

- (void) yourMainFunction {
    activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];

    [NSThread detachNewThreadSelector:@selector(threadStartAnimating) toTarget:self withObject:nil];

    //Your computations

    [activityIndicator stopAnimating];

}

- (void) threadStartAnimating {
    [activityIndicator startAnimating];
}
祝你好运! -Karoly

答案 1 :(得分:0)

创建一个webview。将活动指示符添加到webview。如果要通过url将图像加载到webview中,请实现webview委托方法。加载URL后,停止活动指示器的动画。

让我知道您无法实施哪一步。

答案 2 :(得分:0)

[self.navigationController pushViewController:first animated:YES];

通常,当您将视图控制器推入导航控制器时,它将调用 - (void)viewWillAppear:和 - (void)viewDidAppear:方法。您可以在viewWillAppear中添加活动指示器视图:并调用指标视图的startAnimation。您不能在相同的运行循环下调用startAnimationstopAnimation。例如,

- (void)viewWillAppear:(BOOL)animated 
{
    [aIndicatorView startAnimation];

    // do somethings ....

    [aIndicatorView stopAnimation];  
}

因为startAnimationstopAnimation在同一个运行循环下,所以不会显示任何动画。

但是如果你在 - (void)viewWillAppear中调用startAnimation:并在另一条消息中调用stopAnimation,如下所示。

- (void)viewWillAppear:(BOOL)animated
{
    [aIndicatorView startAnimation];

    // do somethings... 
}

- (void)viewDidAppear:(BOOL)animated
{
    [aIndicatorView stopAnimation];
}

因为viewWillAppear:和viewDidAppear:使用不同的运行循环调用,所以活动指示器视图将运行良好。

或者,您可以执行以下操作:

- (void)viewWillAppear:(BOOL)animated 
{
    [aIndicatorView startAnimation];

    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate date]];

    // do somethings ....

    [aIndicatorView stopAnimation];
}

上面的例子是个坏例子,因为它在-runUntilDate中调用了两个或多个动画:但它会让活动指标视图有效。