/ / O uso de setViewController do UINavigationController no iPhone não se comporta adequadamente - objective-c, uinavigationcontroller, pushviewcontroller

Usar o setViewController do UINavigationController no iPhone não se comporta adequadamente - objective-c, uinavigationcontroller, pushviewcontroller

Estou tendo um problema com um aplicativo do iPhone usandoUINavigationController. Quando eu estou usando pushNavigationController, ele funciona bem. O iPhone faz sua animação enquanto alterna para o próximo ViewController. Mas ao usar uma matriz de ViewControllers e o método setViewControllers, ele tem uma falha na animação que pode se transformar em uma animação claramente visível. erro.

O snippet a seguir é chamado na raizViewController. Dependendo de uma condição, ele deve alternar para ViewController1 ou ir diretamente para ViewController2. Neste último caso, o usuário pode navegar de volta para vc1 e, em seguida, para a raiz.

NSMutableArray* viewControllers = [NSMutableArray arrayWithCapacity:2];
// put us on the stack
[viewControllers addObject:self];
// add first VC
AuthentificationViewController* authentificationViewController =
[[[AuthentificationViewController alloc] initWithNibName:@"AuthentificationViewController" bundle:nil] autorelease];
[viewControllers addObject:authentificationViewController];

if (someCondition == YES)
{
UserAssignmentsListViewController* userAssignmentsListViewController =
[[[UserAssignmentsListViewController alloc] initWithNibName:@"UserAssignmentsOverviewViewController" bundle:nil] autorelease];

[viewControllers addObject:userAssignmentsListViewController];
}

[self.navigationController
setViewControllers:[NSArray arrayWithArray:viewControllers] animated:YES];

Como você pode ver eu vou adicionar o primeiro e talvez osegundo VC para o array, finalmente definindo a pilha de navigationController com animação. Isso funciona corretamente se eu apenas adicionar o primeiro controlador. Mas no caso em que a animação deve ir para o segundo controlador, o título da barra de navegação não será "voando". Em vez disso, há um título vazio até a animação terminar. E, pior ainda, se eu substituir o título da barra de navegação por um botão personalizado, esse botão será exibido no canto superior esquerdo até a animação terminar. Isso é um erro de exibição.

Eu tentei usar uma solução alternativa com váriosOs métodos pushViewController, mas a animação não parece correta. Eu quero que a navegação faça sua animação da mesma forma que o pushViewController faz. A única diferença aqui é que eu não adiciono um VC, mas coloco toda a pilha em uma vez. Existe outra solução alternativa aqui, ou isso pode ser considerado como um bug do framework? Eu pensei em usar apenas pushNavController para VC2, então de alguma forma inserir VC1 na pilha, mas isso não parece possível.

Obrigado por todas as dicas e conselhos. :-)

Dados técnicos: estou usando o iOS 4.2, compilando para 4.0.

Respostas:

5 para resposta № 1

Finalmente encontrei a solução. O erro foi que o novo NavigationController de nível superior não foi inicializado e carregado corretamente até que a animação seja concluída. No meu caso, UserAssignmentsListViewController tem um viewDidLoad método que não será chamado até que a animação seja feita, mas define o título de navegação (aqui: um UIButton). Portanto, a animação falha.

A solução é consultar um controlador de visualização já inicializado quando for empurrado para a pilha. Então inicialize nosso VC de nível superior em algum lugar:

// initialize our top-level controller
ViewController* viewController2 = [[[ViewController alloc]
initWithNibName:@"ViewController" bundle:nil] autorelease];

Então, ao empurrar dois ou mais VCs para a pilha, o primeiro nível já está inicializado e a animação funciona (seguindo o exemplo da minha pergunta original):

NSMutableArray* viewControllers = [NSMutableArray arrayWithCapacity:2];
// put us on the stack, too
[viewControllers addObject:self];

ViewController* viewController1 = [[[ViewController alloc]
initWithNibName:@"ViewController" bundle:nil] autorelease];
[viewControllers addObject:viewController1];

if (someCondition == YES)
{
[viewControllers addObject:viewController2];
}

[self.navigationController
setViewControllers:[NSArray arrayWithArray:viewControllers] animated:YES];