UIActivityIndi​​catorView 不显示/开始动画 [英] UIActivityIndicatorView does not show/start animating

查看:24
本文介绍了UIActivityIndi​​catorView 不显示/开始动画的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个带有 UIActivityIndi​​catorView 的视图控制器和一个触发同步的按钮.同步在单独的类中执行,通常在后台进行.同步可以从我的应用程序的不同部分触发,并且我的视图控制器会收到同步事件的通知.

I have a view controller with an UIActivityIndicatorView, and a button which triggers synchronisation. Synchronisation is performed in a separate class, usually in the background. The synchronisation can be triggered from different parts of my app, and my view controller is notified of the synchronisation events.

现在,当我单击按钮时,UIActivityIndi​​catorView 既不可见也不动画.

Now, when I click the button, the UIActivityIndicatorView does not become visible nor animated.

这是我在 viewDiDLoad 中的代码:

Here is my code in viewDiDLoad:

self.syncNowActivityIndicatorView.hidesWhenStopped = YES;
self.syncNowActivityIndicatorView.color = [MRStyleController getFirstLightColor];



[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(leechStarted)
                                             name:MRLeechStartedNotification
                                           object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(mergeStarted)
                                             name:MRMergeStartedNotification
                                           object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(fileSyncStarted)
                                             name:MRFileSyncStartedNotification
                                           object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(leechFailed)
                                             name:MRLeechFailedNotification
                                           object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(mergeFailed)
                                             name:MRMergeFailedNotification
                                           object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(fileSyncFailed)
                                             name:MRFileSyncFailedNotification
                                           object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(leechCompleted)
                                             name:MRLeechCompletedNotification
                                           object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(mergeCompleted)
                                             name:MRMergeCompletedNotification
                                           object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(fileSyncCompleted)
                                             name:MRFileSyncCompletedNotification
                                           object:nil];

我在其他一些帖子中读到过,如果我在同一个方法中启动和停止指标视图,它将不起作用,因为在方法执行时 ui 不会更新.因此,动画必须在单独的线程中启动和停止,但在我的情况下,启动和停止调用都在不同的方法中.

I have read in some other posts, that, if I start and stop the indicator view in the same method, it will not work, because the ui is not update while the method is executing. So, the animation must be started and stopped in a separate thread, but in my case start and stop calls are all in different methods.

请注意,我正在接收日志显示的通知.

Note that I am receiving the notifications as my log shows.

这里是其他方法:

-(void)leechStarted{
    NSLog(@"Leech started");
    if (!_syncNowActivityIndicatorView.isAnimating) {
        [_syncNowActivityIndicatorView startAnimating];
    }
}
-(void)mergeStarted{
    NSLog(@"Merge started");
    if (!_syncNowActivityIndicatorView.isAnimating) {
        [_syncNowActivityIndicatorView startAnimating];
    }
}
-(void)fileSyncStarted{
    NSLog(@"FileSync started");
    if (!_syncNowActivityIndicatorView.isAnimating) {
        [_syncNowActivityIndicatorView startAnimating];
    }
}

-(void)leechFailed{
    NSLog(@"Leech failed");
    if (_syncNowActivityIndicatorView.isAnimating) {
        [_syncNowActivityIndicatorView stopAnimating];
    }
}
-(void)mergeFailed{
    NSLog(@"Merge failed");
    if (_syncNowActivityIndicatorView.isAnimating) {
        [_syncNowActivityIndicatorView stopAnimating];
    }
}
-(void)fileSyncFailed{
    NSLog(@"FileSync failed");
    if (_syncNowActivityIndicatorView.isAnimating) {
        [_syncNowActivityIndicatorView stopAnimating];
    }
}

-(void)leechCompleted{
    NSLog(@"Leech completed");
    if (_syncNowActivityIndicatorView.isAnimating) {
        [_syncNowActivityIndicatorView stopAnimating];
    }
}
-(void)mergeCompleted{
    NSLog(@"Merge completed");
    if (_syncNowActivityIndicatorView.isAnimating) {
        [_syncNowActivityIndicatorView stopAnimating];
    }
 }
 -(void)fileSyncCompleted{
    NSLog(@"FileSync completed");
    if (_syncNowActivityIndicatorView.isAnimating) {
        [_syncNowActivityIndicatorView stopAnimating];
    }
 }

这里是按钮的 IBAction:

And here the IBAction for the button:

- (IBAction)syncNow:(id)sender {
    // perform synchronisation
    CoreDataHelper *cdh = [(MRMedSafeAppDelegate *) [[UIApplication sharedApplication] delegate] cdh];
    if ([cdh canSynchronize]) {
        [cdh mergeEnsemble];
        [cdh synchroniseFiles];
    }
}

mergeEnsemble 发布 leech 和合并通知,以及 synchroniseFiles 文件同步通知,我根据日志接收它们.

mergeEnsemble posts leech and merge notifications, and synchroniseFiles file sync notifications, and I receive them according to the log.

推荐答案

必须在主线程上执行开始/停止动画:

You must perform the start/stop animating on the main thread:

-(void)stopAnimation:(id)sender {
   if( _syncNowActivityIndicatorView.isAnimating ) {
      [_syncNowActivityIndicatorView stopAnimating];
   }
}

-(void)startAnimation:(id)sender {
   if( !_syncNowActivityIndicatorView.isAnimating ) {
      [_syncNowActivityIndicatorView startAnimating];
   }
}

-(void)leechStarted{
    NSLog(@"Leech started");
    [self performSelectorOnMainThread:@selector(startAnimation:) withObject:self waitUntilDone:YES];
}

-(void)leechFailed{
    NSLog(@"Leech failed");
    [self performSelectorOnMainThread:@selector(stopAnimation:) withObject:self waitUntilDone:YES];
}

这篇关于UIActivityIndi​​catorView 不显示/开始动画的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆