我想在实例化一些需要一些时间的ui元素时更新进度条。我首先在viewLoad方法中创建我的视图,然后在那里添加我的进度条。一旦我的视图出现在viewDidAppear方法中,我正在进行几个uikit对象实例化,但我想同时更新进度条。我不知道如何继续,因为一切都应该在主线程中发生,因为它是ui元素。
以下是我的代码的一部分:
-(void) viewDidAppear:(BOOL)animated
{
// precompute the source and destination view screenshots for the custom segue
self.sourceScreenshotView = [[UIImageView alloc] initWithImage:[self.view pw_imageSnapshot]];
[self.progressBar setProgress:.3];
SCLViewController *rvc = [[SCLViewController alloc] init];
UIView *destinationView = rvc.view;
destinationView.frame = CGRectMake(0, 0, kWidthLandscape, kHeightLandscape);
self.destinationScreenshotView = [[UIImageView alloc] initWithImage:[destinationView pw_imageSnapshot]];
[self.progressBar setProgress:.5];
}
在上面的代码中,我只需创建两个视图截图即可在以后使用它们。问题是我只在进度条设置进度时看到上次更新(.5)。进行此更新的正确方法是什么?
答案 0 :(得分:0)
您可以使用performSelectorInBackground:withObject:方法来实例化您的重视图。该方法(实例化您的视图的方法)必须在主线程中设置进度条进度。
所以你的代码看起来像这样:
- (void)viewDidAppear:(BOOL)animated
{
[self performSelectorInBackground:@selector(instantiateHeavyViews) withObject:nil];
}
- (void)instantiateHeavyViews
{
self.sourceScreenshotView = [[UIImageView alloc] initWithImage:[self.view pw_imageSnapshot]];
[self performSelectorOnMainThread:@selector(updateMyProgressView:) withObject:[NSNumber numberWithFloat:0.3f] waitUntilDone:YES];
SCLViewController *rvc = [[SCLViewController alloc] init];
UIView *destinationView = rvc.view;
destinationView.frame = CGRectMake(0, 0, kWidthLandscape, kHeightLandscape);
self.destinationScreenshotView = [[UIImageView alloc] initWithImage:[destinationView pw_imageSnapshot]];
[self performSelectorOnMainThread:@selector(updateMyProgressView:) withObject:[NSNumber numberWithFloat:0.5f] waitUntilDone:YES];
}
- (void)updateMyProgressView:(NSNumber *)progress
{
[self.progressBar setProgress:[progress floatValue]];
}
编辑:当然,它不会为您的进度条设置动画(我不知道这是否是您想要的)。如果您希望在创建视图时继续前进,则应使用委托来通知进度,这可能会有点困难。这样,每次通知代理时,您都可以更新进度条。