UIActivityIndicatorView 不显示/开始动画 [英] UIActivityIndicatorView does not show/start animating
问题描述
我有一个带有 UIActivityIndicatorView 的视图控制器和一个触发同步的按钮.同步在单独的类中执行,通常在后台进行.同步可以从我的应用程序的不同部分触发,并且我的视图控制器会收到同步事件的通知.
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.
现在,当我单击按钮时,UIActivityIndicatorView 既不可见也不动画.
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];
}
这篇关于UIActivityIndicatorView 不显示/开始动画的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!