viewDidAppear для подпредставлений - PullRequest
3 голосов
/ 29 марта 2011

Я хочу загрузить некоторые данные при нажатии кнопки и показать «представление загрузки» в качестве подпредставления моего текущего представления во время его загрузки.

Итак, я хочу начать загрузку только после появления подпредставления.Если нет, мой пользовательский интерфейс застревает без уведомления (а подпредставление отображается только после завершения загрузки).

Есть ли способ использовать что-то вроде viewDidAppear для подпредставлений?

Выполнениеработать сразу после addSubview:, как будто это не работает:

- (void)doSomeWorkAndShowLoadingView
{
    UIView *loadingView = [[[UIView alloc] initWithFrame:self.view.frame] autorelease];
    loadingView.backgroundColor = [UIColor redColor];
    [self.view addSubview:loadingView];
    [self doSomeWork];
    [loadingView removeFromSuperview];
}
- (void)doSomeWork
{ 
    sleep(5);
}

(я не хочу выполнять загрузку в новом потоке, потому что это CoreData, над которым я работаю, то есть 't thread safe).

Спасибо!

Ответы [ 2 ]

2 голосов
/ 01 апреля 2011

Я нашел решение:

Добавляя подпредставление с анимацией, я мог бы использовать - (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag для вызова чего-то вроде subviewDidAppear делегата подпредставления.

В подклассе UIView:

#define KEY_SHOW_VIEW @"_ShowLoadingView_"
#define KEY_HIDE_VIEW @"_HideLoadingView_"
- (void)addToSuperview:(UIView *)theSuperview
{

    [theSuperview addSubview:self];   

    CATransition *animation = [CATransition animation];
    [animation setDuration:0.2];
    [animation setType:kCATransitionFade];
    [animation setDelegate:self];
    [animation setRemovedOnCompletion:NO];
    [animation setValue:KEY_SHOW_VIEW forKey:@"animation_key"];
    [[theSuperview layer] addAnimation:animation forKey:nil];

}

- (void)removeFromSuperview
{
    CATransition *animation = [CATransition animation];
    [animation setDuration:0.2];
    [animation setType:kCATransitionFade];
    [animation setDelegate:self];
    [animation setRemovedOnCompletion:NO];
    [animation setValue:KEY_HIDE_VIEW forKey:@"animation_key"];
    [[self.superview layer] addAnimation:animation forKey:nil]; 

    [super removeFromSuperview];
}

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
{    
    NSString* key = [anim valueForKey:@"animation_key"];
    if ([key isEqualToString:KEY_SHOW_VIEW]) {
        if (self.delegate) {
            if ([self.delegate respondsToSelector:@selector(loadingViewDidAppear:)]) {
                [self.delegate loadingViewDidAppear:self];
            } 
        }
    } else if ([key isEqualToString:KEY_HIDE_VIEW]){
        [self removeFromSuperview];
    }
}

Это дало мне результаты, которые я искал.

Еще раз спасибо за вашу помощь!

1 голос
/ 29 марта 2011

Вы можете либо просто начать загрузку сразу после вызова [parentView addSubview:loadingView], либо в представлении загрузки (если оно подклассифицировано) переопределить didMoveToSuperview примерно так:

- (void)didMoveToSuperview {
    // [self superview] has changed, start loading now...
}
...