我有一个标签栏应用程序,一旦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;
}
答案 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 。
我认为应用代表确实是一个更好的地方。