Клавиатура теряет способность скрываться "если я использую UIAlertView" - PullRequest
4 голосов
/ 14 июля 2011

Я кодирую какое-то приложение для iPad, и странный эффект начал появляться.

Я использую панель навигации, чтобы свободно перемещаться по своим представлениям. Во всяком случае, в одном из этих внутренних представлений я предлагаю возможность проверить, действительно ли пользователь хочет вернуться к основному виду через представление предупреждений (просто пара кнопок «Да / нет»). Как только пользователь подтверждает, что хочет вернуться назад, я «вручную» открываю представление и перехожу к основному виду, где прячется клавиатура.

НО, дело в том, что виртуальная клавиатура ведет себя странно. Внутри «внутреннего вида» клавиатура видна 90% времени (это нормально, вокруг много UITextFields). Что мне делать, чтобы скрыть это всякий раз, когда я хочу, чтобы оно стало скрытым? Я поместил что-то вроде этого в "main viewWillAppear":

[self.view endEditing:YES];

Видимо скрывает клавиатуру, а когда я делаю:

[[self navigationController] popToRootViewControllerAnimated:YES]; 

iPad перемещается назад, а затем клавиатура исчезает. Ничего страшного (в первый раз).

Но потом я решаю снова войти в тот же вид, поэтому появляется клавиатура, я делаю какие-то модные вещи. Затем я решаю прервать (с моей кнопкой), я снова показываю тот же самый вид предупреждения и подтверждаю, что хочу вернуться к основному виду (как и раньше). Код тот же, но на главном экране:

[self.view endEditing:YES];

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

Почему я знаю, что в UIAlertView есть чем заняться? Потому что, если я изменю код внутри моей «кнопки отмены» из этого:

alertViewQuestionType=ALERT_ABANDON_TEST;
UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:@"" message:NSLocalizedStringFromTable (@"STR_ABANDON_TEST_WARNING", @"ui_strings", @"") delegate:self cancelButtonTitle:NSLocalizedStringFromTable (@"STR_CANCEL", @"ui_strings", @"") otherButtonTitles:nil] autorelease];
[alert addButtonWithTitle:NSLocalizedStringFromTable (@"STR_ABANDON", @"ui_strings", @"")];
[alert show];

на это:

[[self navigationController] popToRootViewControllerAnimated:YES];

(то есть, нет подтверждения для пользователя, пользователь просто переходит назад, когда нажимается кнопка отмены), затем, когда основной вид достигает функции «viewWillAppear», код скрытия клавиатуры работает. Не только ТО, но ВСЕ время до конца сеанса моего приложения.

Не знаю, понятен ли мой вопрос на 100%, но я буду более чем рад добавить сюда несколько дополнительных кусочков кода, если кто-то поверит, что он может пролить свет на эту тайну ...

Привет!

Ответы [ 2 ]

5 голосов
/ 18 июля 2011

Я наконец-то решил свою проблему.Я более чем уверен, что мог бы сделать лучше, но пока, даже я до сих пор не знаю, «что вызывает вышеупомянутое поведение», я более чем счастлив.

Дело в том, что еслиЯ «отодвинул» представление, ОТ внутри кода делегата UIAlertView, iOS считает, что это то, что я не должен делать, и его внутренний код управления клавиатурой «выходит из-под контроля».Как будто я возвращаюсь «слишком рано» или не позволяю iOS закрыть все структуры данных клавиатуры, которые ей нужны для закрытия.

Так что коллега ( aleixventa ) дала мне подсказку: «Почему бы вам не задержать немного« всплывающий »код, обернув его внутри« NSTimer структуры »? И именно это я и сделал. Мой ручной код« всплывающего назад »теперь такой:

NSTimer* testTimer = [NSTimer scheduledTimerWithTimeInterval:.05 target:self selector:@selector(popViewPorTimer) userInfo:nil repeats: NO];

Имея небольшую функцию для моего селектора popViewPorTimer:

-(void) popViewPorTimer
{
    [[self navigationController] popViewControllerAnimated:YES];
}

И теперь, независимо от того, сколько раз клавиатура была отклонена с помощью «Навигация назад», она всегда становится скрытой.YAY !!

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

Мне нравится, когда я сам "решаю свои вопросы":)

1 голос
/ 15 июля 2011

Ну, я, должно быть, был полностью введен в заблуждение, потому что я удалил все следы [self.view endEditing:YES] и / или resignFirstResponder во ВСЕХ моих файлах .m и обнаружил 2 вещи:

1.- Они НИЧЕГО не делали.Клавиатура автоматически исчезает при необходимости.

2.- Ошибка, которую я первоначально описал, все еще существует.

Так что, насколько я знаю, когда я просто "нажимаю" назад в реальном UINavigationBar Кнопка «Назад» (в любом внутреннем виде), вид открывается, и если клавиатура присутствовала, она исчезает.Пока все хорошо.

Затем в другой раз мне нужно смоделировать кнопку "Назад".Я делаю это с помощью:

[[self navigationController] popViewControllerAnimated:YES];

Он работает безупречно, то есть просто всплывает, а если клавиатура присутствовала, он исчезает.

BUUUT, если я напишу это "руководство назад«действие ВНУТРИ какого-то UIAlertView делегата», которое мне также нужно (где я имею дело с двумя кнопками «Принять / Отменить»), это «ручное обратное действие» также возвращается к «родительскому» представлению (всегда нормально), но оно скрывает клавиатуруТОЛЬКО в первый раз это называется.Последующие вызовы «ручного возврата» с помощью этой функции «принять / отменить» UIAlertDelegate делают «механизм скрытия клавиатуры» полностью непригодным для оставшейся части сеанса.

Я просто потерян.

...