【问题标题】:Show a view as a splash screen in didFinishLaunchingWithOptions在 didFinishLaunchingWithOptions 中将视图显示为初始屏幕
【发布时间】:2010-10-21 04:30:32
【问题描述】:

我有一个标签栏应用程序,我想在 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;
}

【问题讨论】:

    标签: iphone objective-c


    【解决方案1】:

    首先我要提到的是,启动画面在 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;
    

    然后确保并在应用委托上实现该方法:

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

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

    希望这会有所帮助。

    【讨论】:

    • 我发现这种方法非常有趣,但我一定是在做一些糟糕的事情,因为我使用此代码的结果是两条编译器消息:1. 错误:在非结构中请求成员“委托”或联合 2. 警告:'UIWindow' 可能不会响应 '-addSubView:'
    • 我在没有编译的情况下输入了这个 :) 它是 addSubview(小写“v”)。
    • 此外,委托是您自己实现的东西,作为启动视图控制器上的属性。 @property (nonatomic, assign) id 委托;我已经更新了问题以显示这一点...
    【解决方案2】:

    在您的应用代理的头文件中:

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

    在 IB 中打开 SplashView.xib,将文件所有者的类设置为您的应用程序委托的类,连接启动出口。添加此以显示启动视图:

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

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

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

    您可以使用 UIView 动画块来淡出启动视图,使其更加酷炫。也就是说,闪屏是邪恶的

    我认为应用代理确实是处理这类东西的更好地方。

    【讨论】:

    • 为什么你觉得应用代理是一个更好的地方?只是好奇,也许我错过了一些重要的东西。
    • 因为闪屏是一个一次性的 UI 元素,它会在您的大部分代码甚至没有初始化时显示。基本上,只加载主 nib,并且至少保证代码中唯一的对象被完全初始化,即应用程序委托。出于完全相同的原因,它接收 applicationDidLaunch 类型的通知,恕我直言,它是管理启动画面的理想人选。也就是说,将功能封装在一个特殊的类中也不是一件坏事,如果你觉得它更舒服的话,但远非必要。
    • 是的,我明白你的意思。非常具体的案例。
    【解决方案3】:

    我会这样做:

        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
    }
    

    我可能不会在应用程序委托中执行此操作,而是在根视图控制器中执行此操作。您永远不必直接向窗口添加任何不必要的内容,尤其是当它包含交互时(我知道这不会)。

    【讨论】:

    • 我实际上有一些代码在我的 SplashViewController 中进行连接测试,所以我不能只使用图像。这是很好的代码,非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多