Представление модального представления иногда скрывает панель навигации

Я столкнулся с этим уже дважды.

Иногда используется следующая строка кода:

[self.navigationController presentModalViewController:aViewController animated:YES];

отображает представление, но панель навигации затем скрывается.

Я могу написать:

[self.navigationController setNavigationBarHidden:NO];

к моему сердцу содержание, везде я могу думать без эффекта.

Кто-нибудь столкнулся с этим?

Я делаю что-то глупое?


person Corey Floyd    schedule 04.06.2009    source источник


Ответы (4)


Нет, я тоже столкнулся с этим. Проблема в том, что когда вы представляете контроллер модального представления с классом на основе UIViewController, он не расширяет панель навигации вызывающего навигационного контроллера на модальное окно. Модальное представление охватывает весь экран. В итоге для решения проблемы я создал UINavigationController и поместил в него класс на основе UIViewController, а затем сделал PresentModalViewController для экземпляра навигационного контроллера.

подобно:

UIViewController *vc = [[UIViewController alloc] init];
UINavigationController *cntrol = [[UINavigationController alloc] initWithRootViewController:vc];
[self presentModalViewController:cntrol animated:YES];
[cntrol release];

Это позволило мне иметь навигационную панель вверху.

Я не уверен, поможет ли это в вашем конкретном случае, единственное, что я бы посоветовал, — это воспроизвести поведение модального окна с помощью UIAnimation, который останавливается на 44 пикселя ниже верхней части телефона. Это позволит сохранить исходную панель навигации видимой.

person Heat Miser    schedule 04.06.2009
comment
О, чувак, я тупой. Мне не нужен был навигационный контроллер вверху, просто панель инструментов, любая панель инструментов. Спасибо - person Corey Floyd; 04.06.2009
comment
Кстати, спасибо, что крутил эту песню у меня в голове последние 5 часов. Я чувствую, что это рождество. - person Corey Floyd; 04.06.2009
comment
У меня давно это в голове крутится :-) - person Heat Miser; 04.06.2009
comment
У меня была такая же проблема. Решение работает хорошо, спасибо! Проголосовал за :) - person AlexB; 09.07.2010
comment
вау большое спасибо. Я хотел бы проголосовать за это несколько раз. это сводило меня с ума. - person Alec Gorge; 23.03.2011
comment
Разве UIViewController не протекает? - person madmax; 12.06.2011

@HeatMiser показывает отличный способ обойти «ошибку», связанную с невозможностью отображения элементов на панели навигации. Однако я не уверен, является ли это исключительно ошибкой Presentation, поскольку модальные операции должны преобладать над темой интерфейса базового представления. То, что тема модальной операции имитирует базовую тему пользовательского интерфейса, — это хорошо, но обертывание истинного модального представления представлением навигации кажется мне неправильным (дополнительный объект представления просто для того, чтобы получить немного больше поведения).

Вместо этого у меня сработало следующее и дает то же поведение, что и «Новое сообщение» в почтовой программе (на iPhone).

В IB поместите UIToolBar в верхней части модального экрана (имитируя панель навигации) с элементами UIBarButtonItem «Отмена» и «Сохранить» и элементом кнопки гибкого пробела между ними, чтобы кнопки были выровнены по левому и правому краю. Затем добавьте UILabel по центру UIToolBar (шрифт Helvetica, полужирный, размер 18 отображается в соответствии с заголовком панели навигации). Подключите кнопки к IBAction в модальном UIViewController, и все готово.

person Andrew Philips    schedule 22.03.2012

Если активен навигационный контроллер, вам следует просто использовать

[self.navigationController pushViewControllerAnimated: как];

чтобы вставить другой контроллер представления, предоставляя себе и пользователю согласованный пользовательский интерфейс с «автоматической» поддержкой кнопки «Назад».

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

person grwww    schedule 12.04.2013

Возможно, это очевидно, но как только вы закончите с модальным представлением и захотите его закрыть, вы должны сделать что-то вроде этого в своем модальном vc:

[parentController уволитьModalViewControllerAnimated:YES];

Где parentController — это ссылка на vc, из которой вы представляете модальное представление.

person Fede Mika    schedule 04.08.2010
comment
Я просто делаю [самоотклонениеModalViewControllerAnimated:YES]; и это имеет тот же эффект. - person Jonny; 01.12.2010
comment
да, ты прав, Джонни, может быть, у меня не работала какая-то другая проблема, кто знает.... :P - person Fede Mika; 19.03.2011