【问题标题】:How show activity-indicator when press button for upload next view or webview?按下按钮上传下一个视图或网页视图时如何显示活动指示器?
【发布时间】:2011-10-13 08:15:31
【问题描述】:

当我单击标题为单击此处放大的按钮时,我想在第一个视图上显示活动指示器并在加载此视图时删除。

但是我回去然后它显示在这个视图中显示的活动指示器。

在第一个 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 ];

        }} 

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

【问题讨论】:

标签: objective-c ios xcode uiview uiwebview


【解决方案1】:
[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];

    // Let run loop has chances to animations, others events in run loop queue, and ... etc. 
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate date]];

    // do somethings ....

    [aIndicatorView stopAnimation];
}

以上示例是bad 示例,因为它调用-runUntilDate: 中的两个或多个动画。但它会让活动指示器视图工作。

【讨论】:

  • 它不工作我已经编辑了我的问题,所以你再检查一次。
【解决方案2】:

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];
}

祝你好运! -卡罗利

【讨论】:

  • 它不起作用我已经编辑了我的问题,所以你再检查一次。
  • 我不喜欢分成单独的方法或线程,所以我经常在开始动画后添加[[NSRunLoop currentRunLoop] runUntilDate:[NSDate date]]。
【解决方案3】:

创建一个网页视图。将活动指示器添加到 web 视图。如果您通过 url 将图像加载到 webview 中,则实现 webview 委托方法。加载 url 后,停止对活动指示器进行动画处理。

让我知道您无法执行哪个步骤。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    • 1970-01-01
    相关资源
    最近更新 更多