Present/dismissModalViewController заставляет UINavigationBar Back терять анимацию

У меня есть UITableViewController, который отправляет UIViewController с помощью UINavigationController:

[self.navigationController pushViewController:detailViewController animated:YES];

В detailViewController я представляю модальное представление, когда пользователь нажимает кнопку (MFMessageComposeViewController для отправки SMS-сообщения), а затем закрываю его, например:

[self presentModalViewController:smsViewController animated:YES];
...
// user pushes Send or Cancel button on the view
...
[self dismissModalViewControllerAnimated:YES];

Модальное представление SMS закрывается правильно, но теперь, когда я нажимаю кнопку «Назад» на UINavigationBar, представления не возвращаются к табличному представлению. Подробное представление просто исчезает, а представление UITableViewController остается. Кнопка «Назад» анимируется и исчезает, а выбранная ячейка таблицы по-прежнему имеет эффект затухания синего цвета, но анимация просмотра отсутствует.

Кто-нибудь знает, почему представления не анимируются должным образом? Если я не открываю модальное представление SMS, то анимация работает правильно, поэтому я почти уверен, что это каким-то образом вызвано модальным поведением.

Вот как выглядит моя компоновка представления Interface Builder для этого элемента панели вкладок:

Просмотр расположения


person spurgeon    schedule 18.07.2012    source источник
comment
Вы пробовали это без анимации ?? Я не нахожу причин, которые могут вызывать ту же проблему. это очень распространенная практика.   -  person Tarun    schedule 18.07.2012
comment
Извините, я не понимаю, что вы имеете в виду. Что попробовать без анимации? Если я изменю любое из ДА на НЕТ в своих фрагментах кода, я не уверен, что это даст. Это просто делает эти действия неанимированными.   -  person spurgeon    schedule 18.07.2012


Ответы (2)


Измените эту строку [self.navigationController pushViewController:detailViewController]; на

[self.navigationController pushViewController:detailViewController animated:YES];

И проверьте, установлены ли методы viewWillAppear и viewWillDisappear вашего detailView в YES.

person Midhun MP    schedule 18.07.2012
comment
К сожалению, я пропустил animated:YES при копировании/вставке фрагмента кода. Теперь это исправлено. Интересно, что когда я реализую -(void)viewWillDisappear:(BOOL)animated в detailViewController и печатаю значение animated, оно меняется на НЕТ, когда представлено и отображено модальное представление. Почему это происходит и как изменить animated обратно на YES? - person spurgeon; 18.07.2012
comment
вы устанавливаете -(void)viewWillAppear:(BOOL)animated на ДА? Пожалуйста, установите оба метода вашего модального представления на YES. - person Midhun MP; 18.07.2012
comment
В detailViewController я установил [self viewWillAppear:YES]; и [self viewWillDisappear:YES]; после [self presentModalViewController:smsModalView animated:YES]; и [self dismissModalViewControllerAnimated:YES];, но безрезультатно. Другие предложения? Опять же, модальное представление отлично анимируется, но не подробное представление обратно в табличное представление. - person spurgeon; 18.07.2012
comment
не показывая модальный вид, просто нажмите назад, это анимация? - person Midhun MP; 18.07.2012
comment
да. Если я выберу элемент в табличном представлении и нажму «Назад» в подробном представлении, не открывая модальное представление, анимация будет работать нормально. - person spurgeon; 18.07.2012
comment
[self presentModalViewController:smsModalView animated:NO]; и [self dismissModalViewControllerAnimated:NO]; проверьте и это. Надеюсь, это сработает. - person Midhun MP; 18.07.2012
comment
Хм, тоже пробовал, но не получилось. Спасибо за вашу помощь. - person spurgeon; 18.07.2012

Я обнаружил свою проблему. Я использую пользовательский подкласс UITabBarController, который переопределяет -(void)viewWillAppear:(BOOL)animated с некоторой пользовательской обработкой панели вкладок. Однако я не вызывал [super viewWillAppear:animated] в переопределенном методе. Да, печальный день в моей жизни разработчика. Мне все еще кажется странным, что это вызвало поведение, которое я испытал, но я уверен, что теперь это исправлено из-за этого изменения.

Интересно, что модальная анимация push/dismiss работает корректно без вызова [super viewWillAppear:animated] в симуляторе iPhone 4.3. Но это не работает в симуляторах iPhone 5.0 или 5.1. (Я использовал не-MFMessageComposeViewController для текстового модального поведения на симуляторе iPhone, поскольку SMS не поддерживается на симуляторе).

person spurgeon    schedule 26.07.2012