iphone dev:带有tabbar controller + modalviewcontroller的闪屏

时间:2011-02-16 18:25:40

标签: iphone screen tabbar splash

我是iphone应用程序开发的新手,我尝试使用启动画面构建应用程序。我需要启动画面,因为我的应用程序需要从Web加载xml文件。在此期间,应用程序应显示启动画面(徽标+消息"加载xml ..."),成功加载后应进入主屏幕。

我使用tabbar模板启动了应用,因为这应该在启动画面后显示。第一个选项卡有一个导航控制器(在IB中配置),它在他的堆栈上加载一个自定义视图控制器(我称之为searchViewController.h / .m / .xib)。

我的问题: 如果我运行我的应用程序,屏幕会长时间保持黑色,然后很快会显示启动画面(当它向下移动/消失时),然后显示带有其他附加视图的标签栏。但是当屏幕是黑屏时,我可以在控制台中看到我从XML解析中控制NSLog消息。

这意味着:应用程序启动,获取XML,解析XML,显示启动屏幕大约1毫秒,然后显示主应用程序。但我希望它在XML获取和解析期间已经显示了启动画面。

我的AppDelegate.m:

#import "AppDelegate_iPhone.h"
#import "startPage.h"

@implementation AppDelegate_iPhone

@synthesize window;
@synthesize tabBarController;
@synthesize theVendors;
#pragma mark -#pragma mark Application lifecycle

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

        [window addSubview:tabBarController.view];

        //initialise the splash screen from class startPage as loadingPage
        startPage *loadingPage = [[startPage alloc] init];

        //present splash screen as modalview of the tabbar controller            
        [self.tabBarController presentModalViewController:loadingPage animated:NO];

        //make the hole thing visible (should be visible, but isn't (that's the problem))
        [self.window makeKeyAndVisible];

        //call the splash-screen controller for doing the XML work
        [loadingPage initVendors];
        [loadingPage release];

        return YES;
}

现在是XML内容的spash-screen方法:

-(void)initVendors{
    vendors *theVendorsLocal = [[vendors alloc] initWithDictionary];
    NSURL *xmlURL = [NSURL URLWithString:@"http://.../muuhh.xml"];

    fParser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL];
    [fParser setDelegate:theVendorsLocal];
    [fParser setShouldProcessNamespaces:NO];
    [fParser setShouldReportNamespacePrefixes:NO];
    [fParser setShouldResolveExternalEntities:NO];
    [fParser parse];
    [xmlURL release];



if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad){
    //AppDelegate_iPad *del = (AppDelegate_iPad *)[UIApplication sharedApplication].delegate;   
    //del.theVendors = theVendorsLocal;
}else{
    AppDelegate_iPhone *del = (AppDelegate_iPhone *)[UIApplication sharedApplication].delegate;     
    del.theVendors = theVendorsLocal;
}

    //detach the modalview from the tabbar controller
[self.parentViewController dismissModalViewControllerAnimated:YES];
}

所以问题是,整个解析内容是在显示splash screnn之前完成的。

为什么?

正如你所看到的,我加载tabbarcontroller.view,把它作为窗口的子视图,设置模态视图并执行[self.window makeKeyAndVisible] 之前我调用[loadingPage initVendors];方法......

为什么在整个解析之后会显示启动画面(实际上它甚至没有显示,我只看到它是如何滑出来的)??

感谢您的帮助...


我试图将[self.window makeKeyAndVisible]移到最顶层,但结果仍然相同:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    breakpoint1 ->  [self.window makeKeyAndVisible];
    breakpoint2 ->  [window addSubview:tabBarController.view];

    //initialise the splash screen from class startPage as loadingPage
    breakpoint3 ->  startPage *loadingPage = [[startPage alloc] init];

    //present splash screen as modalview of the tabbar controller            
    [self.tabBarController presentModalViewController:loadingPage animated:NO];

...

我也尝试过其他安排,没有任何效果。最后我开始设置断点并使用NSLog向​​我展示应用程序如何调用每个方法。在观察屏幕时,我发现,[self.window makeKeyAndVisible]的方法调用在调用后不会直接显示视图。

我在上面的源代码中标记了断点:我会假设,在breakpoint1之后黑屏将消失并显示白屏(窗口),然后在断点2处显示标签栏(至少在breakpoint3处) 。但没有任何反应。在整个idFinishLaunchingWithOptions-method完成之前,屏幕一直是黑色的。

我还在applicationDidBecomeActive-method中放置了一些断点,在didFinishLaunchingWithOptions-method之后称为 。如果调试器在applicationDidBecomeActive-method中的一个断点处中断,那么即使屏幕上没有显示任何断点,screnn仍然保持黑色。

最后离开applicationDidBecomeActive-method后,会显示标签栏。

我没有clou,app"去哪里"在离开applicationDidBecomeActive-method之后。

我想知道,实际显示标签栏的位置和时间?

为什么[self.window makeKeyAndVisible]如果我在此通话后面直接停在b reakpoint处,则不会显示该窗口?

1 个答案:

答案 0 :(得分:0)

我怀疑tabbarcontroller无法及时以模态方式显示你的启动画面,因为此时你的窗口仍然是不可见的,因此隐藏了附加到它的视图层次结构。启动画面也属于此层次结构。

尝试将“makeKeyAndVisible”方法移动到didFinishLaunchingMethod的开头,否则在解析xml完成​​之前使视图层次结构可见 - 正如您正在观察它一样。