Где подписаться / отписаться от рассылки UIKeyboardWill (Показать | Скрыть)? - PullRequest
0 голосов
/ 25 апреля 2011

Допустим, у меня есть несколько контроллеров представления, у каждого из которых есть несколько textviews / textfields / webviews. Есть один основной контроллер вида (MainViewController), а остальные отображаются с помощью presentModalViewController:animated:.

РЕДАКТИРОВАТЬ : Я хочу уточнить, что я не использую UINavigationController - контроллер основного вида является просто обычным UIViewController, а другие время от времени отображаются как контроллеры модального представления.

Интересно, как мне реализовать подписку на уведомления клавиатуры, чтобы можно было правильно изменить размер подпредставлений в самом верхнем контроллере представления. Я пробовал 2 подхода:

1 / Подписаться на UIKeyboardWill (Показать | Скрыть) Уведомление в viewDidLoad и отписаться в dealloc.

Проблема: несколько контроллеров представления получают уведомление одновременно, что приводит к странному изменению размера макета.

2 / Подписаться на viewWillAppear, подписаться на viewDidDisappear

Проблема: иногда viewWillAppear не срабатывает, поэтому я вынужден вручную повторно подписаться на уведомления клавиатуры.

Любые советы приветствуются.

Ответы [ 2 ]

2 голосов
/ 25 апреля 2011

Я думаю, Подписаться в viewWillAppear и Отписаться в viewDidDisappear предпочтительнее, чем Подписаться на UIKeyboardWill (Показать | Скрыть) Уведомление в viewDidLoad и отписаться в dealloc.

Как вы упомянули, есть только одна проблема с подходом 2.

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

Вот код, чтобы убедиться, что ваш viewWillAppear триггер всегда.

http://www.idev101.com/code/User_Interface/UINavigationController/viewWillAppear.html

1 голос
/ 25 апреля 2011

Вот мысль, используйте свойство visibleViewController класса UINavigationController.

Реализация уведомления в методе viewView root root ControlViewControllers и вызов метода, такого как updateVisibleViewController, где вы получаете доступ к вашему наиболее видимому контроллеру представления с помощью вызова visibleViewController

-(void)updateVisibleViewController{
   [[rootNavigationController visibleViewController] "trigger your method here"];
}
...