试图删除子视图

时间:2011-03-07 18:00:21

标签: iphone objective-c

我在舞台上有2个子视图(启动画面和主屏幕),一旦启动画面播放完它的音频,它就会调用一个名为-(void)audioComplete的函数,该函数可以淡出启动画面,显示主屏幕。我似乎无法做到这一点。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
    [self.window addSubview:splashController.view];
    [self.window addSubview:rootController.view];

    [self.window makeKeyAndVisible];

    return YES;
}


-(void)audioComplete{
    NSLog(@"REMOVE FROM STAGE");
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];
    [UIView setAnimationDelegate:splashController.view];
    splashController.view.alpha = 0.0;
    [UIView commitAnimations];
    [splashController release]; 
}

如果我在NSLog(@"%@",[splashController.view superview]);函数中添加audioComplete,我会(null),但不是在我将其添加到didFinishLaunchingWithOptions函数时。

4 个答案:

答案 0 :(得分:1)

Apple高度recommends against using splash screens。相反,您应该在根目录中使用名为“Default.png”的图像。这将在应用程序启动时显示,并使您的应用程序看起来比实际更快。如果您创建自己的加载屏幕,Apple可能会拒绝您向应用商店提交的内容。

答案 1 :(得分:1)

可能是以下两件事之一:

1)好像你的rootControllerView正在splashControllerView上添加。

也许你的动画正在发生,但你无法看到它,因为你的rootControllerView正在阻止它。

尝试撤消addSubview的订单。

2)不要使用与动画相同的方法释放启动视图。在释放视图之前等待动画完成。您可以通过以下方式执行此操作:

-(void)audioComplete
{
    NSLog(@"REMOVE FROM STAGE");
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidFinishSelector:@selector(releaseView)];
    splashController.view.alpha = 0.0;
    [UIView commitAnimations]; 
}

-(void)releaseView
{
    [splashController release];
}

此外,作为内存管理的最佳实践,请不要直接发布splashControllerView。

我所做的是在将视图添加为子视图后立即发布视图(添加子视图会增加它的保留计数)。

当我完成子视图时,我只需调用[subView removeFromSuperView],这会减少保留计数并使其为零。

简单地说:

UIView *view = [[UIView alloc] init]; //retain count = 1

[self.view addSubview:view]; //retain count = 2

[view release]; //retain count = 1

//do stuff with the view

[view removeFromSuperview]; //retain count = 0;

答案 2 :(得分:0)

我真的没有看到你的问题,因为在你的didFinishLaunchingWithOptions中你添加了你的观点,那里的非常!因此,每次拨打NSLog(@"%@",[splashController.view superview]);时,您都会收到一个答案,但在audioComplete中您释放了子视图并且它已经离开...之后您将无法访问超级视图,因为 - 您是子视图被释放......

我会用这个:

-(void)audioComplete{
    NSLog(@"REMOVE FROM STAGE");
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];
    [UIView setAnimationDelegate:splashController.view];
    splashController.view.alpha = 0.0;
    [UIView commitAnimations];

    [splashController.view removeFromSuperview];

}

你会再次得到同样的东西,但如果你以后需要的话,你的subView仍然存在。

答案 3 :(得分:0)

用于淡入和淡出飞溅和主屏幕之间的图像。我建议你可以尝试在rootviewcontroller中有两个图像。在两个UIIMageViews之间制作了淡入和淡出动画......

淡入读出这个样本tuts:

http://iosdevelopertips.com/user-interface/fade-transition-fade-images-in-and-out.html

在动画期间,你可以完成你的音频流