viewDidAppear для подвидов

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

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

Есть ли способ использовать что-то вроде 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, над которым я работаю, что не является потокобезопасным).

Спасибо!


person Jochen    schedule 29.03.2011    source источник


Ответы (2)


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

Добавляя подпредставление с анимацией, я мог бы использовать - (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];
    }
}

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

В очередной раз благодарим за помощь!

person Jochen    schedule 31.03.2011

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

- (void)didMoveToSuperview {
    // [self superview] has changed, start loading now...
}
person Simon Cave    schedule 29.03.2011
comment
Не работает. didMoveToSuperview не означает, что подпредставление действительно появилось, а только то, что оно было добавлено в суперпредставление. Если я начну загрузку в didMoveToSuperview, подпредставление все равно будет видно только после загрузки данных. - person Jochen; 29.03.2011
comment
Когда вы говорите «загрузка», что вы делаете? Вы ожидаете сетевой операции или выполняете какие-то вычисления? - person Simon Cave; 29.03.2011
comment
Я загружаю данные из базы данных CoreData. - person Jochen; 29.03.2011
comment
правда не загружается. Я копирую данные из одного объекта в другой. - person Jochen; 29.03.2011
comment
Это определенно звучит как что-то, что должно быть сделано вне основного потока. Если это не вариант, вы можете попробовать вызвать свой метод doSomeWork сразу после того, как добавите подзагрузку. Вот так: [self performSelector:@selector(doSomeWork) withObject:nil afterDelay:1/10] - person Simon Cave; 29.03.2011
comment
Спасибо! Работал на меня! - person Stanislav Pankevich; 04.10.2013