首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >子视图的viewDidAppear

子视图的viewDidAppear
EN

Stack Overflow用户
提问于 2011-03-29 17:38:42
回答 2查看 5.8K关注 0票数 3

我想在按钮被按下时加载一些数据,并在加载时将“加载视图”显示为当前视图的子视图。

所以我只想在子视图出现后才开始加载。如果不是这样,我的UI就会在没有通知的情况下卡住(子视图只有在加载完成后才会显示)。

有没有办法在子视图中使用像viewDidAppear这样的东西?

像这样在addSubview:之后立即做这项工作是行不通的:

代码语言:javascript
复制
- (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,它不是线程安全的)。

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-01 06:08:03

我找到了一个解决方案:

添加带有动画的子视图,我可以使用- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag来调用类似于子视图代理的subviewDidAppear之类的东西。

在UIView的子类中:

代码语言:javascript
复制
#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];
    }
}

这让我得到了我想要的结果。

再次感谢您的帮助!

票数 2
EN

Stack Overflow用户

发布于 2011-03-29 17:50:24

您应该能够直接在调用[parentView addSubview:loadingView]之后开始加载,或者在加载视图(假设它是子类的)中重写didMoveToSuperview,如下所示:

代码语言:javascript
复制
- (void)didMoveToSuperview {
    // [self superview] has changed, start loading now...
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5470552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档