在didFinishLaunchingWithOptions中将视图显示为闪屏

时间:2010-10-21 04:30:32

标签: iphone objective-c

我有一个标签栏应用程序,一旦didFinishLaunchingWithOptions方法加载标签栏控制器,我想简单地显示一个视图(启动画面)。为什么这么难?请告诉我如何加载并在下面显示一个名为SplashView.xib的Xib文件并显示它:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    // Override point for customization after application launch.

    // Add the tab bar controller's view to the window and display.
    [window addSubview:tabBarController.view];
    [window makeKeyAndVisible];

    // Load up and show splash screen Xib here

    return YES;
}

3 个答案:

答案 0 :(得分:4)

我要提到的第一件事是在HIG中特别不赞成防溅屏幕。特别是那些只能让用户等待的东西。盯着他们不关心的一些标志。

现在咆哮已经不在了,我会假设你可能有一些加载,你希望在标签显示之前发生。

在这种情况下,我不会在MainWindow.xib中加载标签栏。相反,我启动了我的单一视图(使用XIB)进行加载。原因是:在您甚至可以看到启动画面之前,您将支付所有这些视图的加载费用。

在加载数据的情况下,有时这些选项卡依赖于正在加载的数据,因此等待加载标签栏控制器更有意义。

应用代表最终看起来像这样:

- (void)applicationDidFinishLaunching:(UIApplication *)application {
    [window makeKeyAndVisible];
    [window addSubview:splashController.view];  //this assumes MainWindow.xib defines your splash screen, otherwise....

    UIViewController *splashController = [[SplashController alloc] initWithNibName:@"SplashController" bundle:nil];
    splashController.delegate = self;
    [window addSubview:splashController.view];

    //hang on to it in an ivar, remember to release in the dealloc
}

然后在启动画面控制器中,当我完成加载时,我这样做:

-(void)doneLoading {
    [self.delegate performSelector:@selector(splashScreenDidFinishLoading)];
}

当然self.delegate不存在,可以像这样添加:

//header
@property (nonatomic, assign) id delegate;

//implementation
@synthesize delegate;

然后确保并在app delegate上实现该方法:

-(void)splashScreenDidFinishLoading {
     //load up tab bar from nib & display on window
     //dispose of splash screen controller
}

我在一些应用程序中使用了这种模式,并且很简单并且运行良好。你也可以选择在上面的方法中做一个漂亮的过渡动画。

希望这有帮助。

答案 1 :(得分:1)

我会做类似的事情:

    UIImageView *imageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"Splash.png"]];
    [imageView setCenter:CGPointMake(240, 160)];

    self.view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
    [self.view addSubview:imageView];

    [imageView retain];

    [NSTimer scheduledTimerWithTimeInterval:3.0 target:self //display for 3 secs
     selector:@selector(continueLoadingWhatever:)
     userInfo:nil
     repeats:NO];

然后......

- (void)continueLoadingWhatever:(id)sender {
    //do whatever comes after here
}

我可能不会在app委托中执行此操作,而是在根视图控制器中执行此操作。您永远不必直接向窗口添加任何不必要的内容,特别是如果它包含交互(我知道这不包含)。

答案 2 :(得分:1)

在你的app delegate的头文件中:

@interface AppDelegate {
    ...
    IBOutlet UIView *splash; // add this line
}

在IB中打开SplashView.xib,将File Owner的类设置为app delegate的类,连接splash outlet。添加此项以显示启动视图:

[[NSBundle mainBundle] loadNibNamed: @"SplashView" owner: self options: nil];
[window addSubview: splash];

您可能也想隐藏启动视图:

[splash removeFromSuperview];
[splash release];
splash = nil;

你可以使用UIView动画块来淡出飞溅视图,使其变得非常酷。也就是说,启动画面 evil

我认为应用代表确实是一个更好的地方。