Arhn - архитектура программирования

Клавиатура теряет способность скрывать, если я использую UIAlertView

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

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

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

[self.view endEditing:YES];

Очевидно, он скрывает клавиатуру, и когда я это делаю:

[[self navigationController] popToRootViewControllerAnimated:YES]; 

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

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

[self.view endEditing:YES];

line, ничего не делает, и, что хуже всего, я потерял возможность закрывать клавиатуру по коду ВЕЗДЕ внутри моего приложения на весь сеанс.

Почему я знаю, что 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%, но я буду более чем рад добавить сюда несколько дополнительных фрагментов кода, если кто-то считает, что может пролить свет на эту тайну...

Привет!


Ответы:


1

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

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

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

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

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

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

И теперь, сколько бы раз клавиатуру не сбрасывал через "Навигация поп назад", она всегда становится скрытой. УРА!!

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

Люблю, когда сама "решаю свои вопросы" :)

18.07.2011
  • Такой глючный. Это все еще происходит в iOS 8.4, и использование UIAlertController вместо UIAlertView не имеет значения. 10.08.2015

  • 2

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

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

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

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

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

    [[self navigationController] popViewControllerAnimated:YES];
    

    Работает без нареканий, то есть просто выскакивает обратно, а если клавиатура была, то пропадает.

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

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

    15.07.2011
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..