3

У меня проблема с iPhone-приложением, использующим UINavigationController. Когда я использую pushNavigationController, он работает нормально. IPhone делает свою анимацию, переключаясь на следующий ViewController. Но при использовании массива ViewControllers и метода setViewControllers у него есть сбой в анимации, который может вырасти в отчетливо видимую анимационную ошибку.Использование setViewController от UINavigationController на iPhone не ведет себя правильно

В корневом ViewController вызывается следующий фрагмент. В зависимости от состояния он должен либо переключиться на ViewController1, либо он должен перейти непосредственно в ViewController2. В последнем случае пользователь может вернуться к vc1, а затем к корню.

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]; 

Как вы можете видеть, что я буду добавить первый и возможно второй VC в массив, наконец, установив navigationController суммируется с анимацией. Это работает правильно, если я добавляю только первый контроллер. Но в случае, когда анимация должна перейти ко второму контроллеру, заголовок навигационной панели не будет «летать». Вместо этого есть пустой заголовок, пока анимация не будет закончена. И, что еще хуже, если я заменю заголовок навигатора на пользовательскую кнопку, эта кнопка будет отображаться в верхнем левом углу до окончания анимации. Это довольно ошибка отображения.

Я попытался использовать обходное решение с несколькими методами pushViewController, но анимация не выглядит/не кажется правильной. Я хочу, чтобы навигация выполняла свою анимацию так же, как и pushViewController. Единственное различие заключается в том, что я не добавляю VC, но сразу устанавливаю весь стек. Есть ли другой способ обхода здесь, или это можно считать ошибкой структуры? Я думал об использовании только pushNavController для VC2, а затем как-то вставлял VC1 в стек, но это не представляется возможным.

Спасибо за все советы и подсказки. :-)

Технические данные: Я использую iOS 4.2, компилируя для 4.0.

+0

Вы нашли решение? Если да, делитесь. Я столкнулся с аналогичной проблемой анимации. – Pria 2011-06-13 04:55:32

ответ

5

Наконец-то я нашел решение. Ошибка заключалась в том, что новый навигационный контроллер верхнего уровня не был инициализирован и загружен должным образом, пока анимация не будет выполнена. В моем случае UserAssignmentsListViewController имеет метод viewDidLoad, который не будет вызываться до тех пор, пока анимация не будет выполнена, но она устанавливает заголовок навигации (здесь: UIButton). Поэтому анимация терпит неудачу.

Решение заключается в том, чтобы обратиться к уже инициализированному контроллеру представления, когда дело доходит до его нажатия в стек. Так инициализировать наш верхний уровень VC где:

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

Тогда при нажатии два или более VCs в стек, верхний уровень один уже инициализирован и анимационные работы (следуя пример из моего первоначального вопроса):

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]; 
Смежные вопросы