我是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处,则不会显示该窗口?
答案 0 :(得分:0)
我怀疑tabbarcontroller无法及时以模态方式显示你的启动画面,因为此时你的窗口仍然是不可见的,因此隐藏了附加到它的视图层次结构。启动画面也属于此层次结构。
尝试将“makeKeyAndVisible”方法移动到didFinishLaunchingMethod的开头,否则在解析xml完成之前使视图层次结构可见 - 正如您正在观察它一样。