0

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

4

1 回答 1

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

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

于 2012-04-15T10:44:46.777 回答