我想在按钮被按下时加载一些数据,并在加载时将“加载视图”显示为当前视图的子视图。
所以我只想在子视图出现后才开始加载。如果不是这样,我的UI就会在没有通知的情况下卡住(子视图只有在加载完成后才会显示)。
有没有办法在子视图中使用像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,它不是线程安全的)。
谢谢!
发布于 2011-04-01 06:08:03
我找到了一个解决方案:
添加带有动画的子视图,我可以使用- (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];
}
}这让我得到了我想要的结果。
再次感谢您的帮助!
发布于 2011-03-29 17:50:24
您应该能够直接在调用[parentView addSubview:loadingView]之后开始加载,或者在加载视图(假设它是子类的)中重写didMoveToSuperview,如下所示:
- (void)didMoveToSuperview {
// [self superview] has changed, start loading now...
}https://stackoverflow.com/questions/5470552
复制相似问题