Я новичок в разработке приложений для iphone и пытаюсь создать приложение с заставкой. Мне нужен экран-заставка, потому что моему приложению нужно загрузить XML-файл из Интернета. во время этого приложение должно отображать заставку (логотип + сообщение «loading xml ...»), и после успешной загрузки оно должно перейти к главному экрану.
Я запустил приложение с шаблоном панели вкладок, потому что это должно отображаться после заставки. первая вкладка имеет контроллер навигации (настроенный в IB), который загружает в свой стек пользовательский контроллер представления (я назвал его searchViewController.h / .m / .xib).
моя проблема:
если я запускаю свое приложение, экран долгое время остается черным, а затем очень скоро появляется заставка (которая движется вниз / исчезает), а затем отображается панель вкладок с другими прикрепленными видами. но пока экран чёрный, я вижу в консоли мой управляющий NSLog-сообщения от разбора XML.
это означает: приложение запускается, извлекает 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;
}
и теперь метод spash-screen для XML-содержимого:
-(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];
}
так что проблема в том, что весь процесс разбора выполняется ДО показа заставки.
почему ??
как вы можете видеть, я загружаю tabbarcontroller.view, помещаю его как подпредставление окна, устанавливаю modalview и делаю [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] не показывает представление сразу после вызова.
Я отмечал контрольные точки в исходном коде выше: я бы предположил, что после контрольной точки1 черный экран исчезнет и отобразится белый экран (окно), а затем в контрольной точке2 появится панель вкладок (по крайней мере, в контрольной точке3) , но ничего не происходит экран остается черным до тех пор, пока весь метод idFinishLaunchingWithOptions не будет завершен.
Я также поместил некоторые точки останова в метод applicationDidBecomeActive, который вызывается после метода didFinishLaunchingWithOptions. если отладчик прерывается в одной точке останова в методе applicationDidBecomeActive, даже если на экране ничего не отображается, экран остается черным.
наконец, после выхода из метода applicationDidBecomeActive, отображается панель вкладок.
У меня нет clou, куда приложение «уходит» после выхода из applicationDidBecomeActive-метода.
И мне хотелось бы знать, где и когда фактически отображается панель вкладок?
почему [self.window makeKeyAndVisible] не показывает окно, если я остановлюсь на точке b, непосредственно за этим вызовом?