Используйте NSTimer для задержки отображения подпредставления, но не удалось

В подробном виде в UISplitViewЯ хочу добавить подпредставление к его UINavigationControllerДитя зрения.

Я использую NSTimer *delayTimer задержать загрузку дочернего вида, потому что я исчезаю в подробном виде с помощью анимации.

delayTimer = [NSTimer scheduledTimerWithTimeInterval:1.3 target:self 
selector:@selector(loadWelcomeView) userInfo:nil repeats:NO];

Представление, которое я хочу добавить, называется welcomeview

- (void) loadWelcomeView 
{
    NSLog(@"Welcome View Loaded.");
    welcomeViewController = [[WelcomeView alloc] 
                         initWithNibName:@"WelcomeView" bundle:nil];
    [self.navigationController addChildViewController:welcomeViewController];
}

Но когда я запустил программу и ждал, она была совершенно пустой!!!

Однако сообщение Welcome view loaded. БЫЛО отображено в окне отладки.

Если я использую [self loadWelcomeView]; вместо использования NSTimer, welcomeview будет отображаться ОТЛИЧНО.

Какую процедуру я сделал неправильно...?

1 ответ

Решение

Пользовательский интерфейс должен происходить в основном потоке, поэтому давайте исключим любые возможные проблемы с потоками, которые могут возникнуть с NSTimers. Попробуйте сделать это:

- (void) loadWelcomeViewWithinMainThread
{
    NSLog(@"Welcome View Loaded.");
    welcomeViewController = [[WelcomeView alloc] initWithNibName:@"WelcomeView" bundle:nil];
    if(welcomeViewController)
    {
        if(self.navigationController)
        {
            [self.navigationController addChildViewController:welcomeViewController];
        } else {
            NSLog( @"navigationController is null");
        }
    } else {
        NSLog(@"welcomeViewController is null");
    }
}

- (void) loadWelcomeViewWithinMainThread {
    [self performSelectorOnMainThread: @selector(loadWelcomeViewWithinMainThread) withObject: nil waitUntilDone: YES];
}
Другие вопросы по тегам