我有一个PhotoViewController
课程,其中@property UIActivityIndicatorView* spinner
。 FlickrPhotoViewController
是PhotoViewController
的子类,它从Flickr下载照片并告诉微调器何时开始和停止动画。每次为视图控制器提供Flickr照片时,都会调用“updatePhoto”:
- (void)updatePhoto { // Download photo and set it
NSLog("updatePhoto called");
if (self.spinner) NSLog(@"Spinner exists in updatePhoto");
dispatch_queue_t downloadQueue = dispatch_queue_create("downloader",
NULL);
[self.spinner startAnimating];
dispatch_async(downloadQueue, ^{
// Download the photo
dispatch_async(dispatch_get_main_queue(), ^{
[self.spinner stopAnimating];
// Set the photo in the UI
}
});
});
}
上面的方法正是我用来在桌面视图控制器中显示旋转轮的同时桌面内容下载,它始终在那里工作。
您会注意到updatePhoto
的开头,如果UIActivityIndicatorView
存在,我会打印一条消息。我在awakeFromNib
,viewDidLoad
和viewWillAppear
中添加了类似的声明。当我运行它时,这是我得到的确切输出:
2013-01-31 21:30:55.211 FlickrExplorer[1878:c07] updatePhoto called
2013-01-31 21:30:55.222 FlickrExplorer[1878:c07] Spinner exists in viewDidLoad
2013-01-31 21:30:55.223 FlickrExplorer[1878:c07] Spinner exists in viewWillAppear
为什么spinner
中不存在awakeFromNib
?文档表明“当一个对象收到一个awakeFromNib消息时,它保证已经建立了所有的插座和动作连接。” IBOutlet可以连接而不存在它连接的对象吗?在这种情况下,spinner
IBOutlet是否可以在未分配spinner
的情况下连接到情节提要板?
除此之外,我覆盖了spinner
的getter,以便在它不存在时进行实例化。结果,打印输出现在看起来像这样:
2013-01-31 21:48:45.646 FlickrExplorer[2222:c07] Spinner exists in awakeFromNib
2013-01-31 21:48:45.647 FlickrExplorer[2222:c07] updatePhoto called
2013-01-31 21:48:45.647 FlickrExplorer[2222:c07] Spinner exists in updatePhoto
2013-01-31 21:48:45.649 FlickrExplorer[2222:c07] Spinner exists in viewDidLoad
2013-01-31 21:48:45.650 FlickrExplorer[2222:c07] Spinner exists in viewWillAppear
这是我原本期望看到的。不过,我仍然没有得到任何动画。
我排除了可能出现的问题:
UIActivityIndicatorView
while some expensive method is blocking the main thread制作动画。在我的项目中,我的所有文件系统I / O和下载方法都在非主dispatch_async
队列中调用。将[self.spinner startAnimating];
放入viewWillAppear
使整个下载过程成功动画,这三种可能性都被排除了。
如果您愿意,可以下载this project。只需转到任何试图显示大照片的屏幕,您就会看到微调器没有出现。这个项目有很多问题,但这是我现在关注的问题。
编辑1:
编辑2(2013年2月2日):
updatePhoto
在prepareForSegue
中设置了照片,因此我在调用FlickrPhotoViewController
方法时仅在iPhone上看到此问题。这有可能导致问题吗?答案 0 :(得分:1)
尝试在调用像这样的updatePoto方法之前启动uiactivityindictor的动画 Tru称之为完全调用UpdatePhoto的所有内容:
[self startAnimatingAndThenUpdatePhoto];
-(void)startAnimatingAndThenUpdatePhoto{
if (self.spinner) NSLog(@"Spinner exists in updatePhoto");
[self.spinner startAnimating];
[self performSelector:@selector(updatePhoto) withObject:nil afterDelay:0.01];
}
- (void)updatePhoto { // Download photo and set it
NSLog("updatePhoto called");
dispatch_queue_t downloadQueue = dispatch_queue_create("downloader",
NULL);
dispatch_async(downloadQueue, ^{
// Download the photo
dispatch_async(dispatch_get_main_queue(), ^{
[self.spinner stopAnimating];
// Set the photo in the UI
}
});
});
}
这不是世界上最好的方法,但它会做好工作