iphone dev: заставка с контроллером вкладок + modalviewcontroller - PullRequest
2 голосов
/ 16 февраля 2011

Я новичок в разработке приложений для 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, непосредственно за этим вызовом?

1 Ответ

0 голосов
/ 16 февраля 2011

Я подозреваю, что tabbarcontroller не может представить ваш экран-заставку модально во времени, потому что в этот момент ваше окно все еще невидимо, следовательно, скрывает иерархию представлений, прикрепленную к нему. Заставка тоже относится к этой иерархии.

Попробуйте переместить метод «makeKeyAndVisible» в начало вашего didFinishLaunchingMethod, в противном случае создание иерархии представления будет видимым до тех пор, пока не завершится синтаксический анализ вашего xml - так же, как вы наблюдаете его.

...