如何在实例化时间消耗ui元素的过程中更新进度条?

时间:2012-04-15 10:33:28

标签: ios5 uikit

我想在实例化一些需要一些时间的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)。进行此更新的正确方法是什么?

1 个答案:

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

编辑:当然,它不会为您的进度条设置动画(我不知道这是否是您想要的)。如果您希望在创建视图时继续前进,则应使用委托来通知进度,这可能会有点困难。这样,每次通知代理时,您都可以更新进度条。