ДЕРЖАТЬ клавиатуру, когда UIAlertcontroller представлен в Swift?

Когда появляется предупреждение, клавиатура закрывается. Я искал везде, но не нашел решений, чтобы клавиатура оставалась видимой. При представлении предупреждения текстовое поле, кажется, автоматически отказывается от первого ответчика, поскольку предупреждение представлено модально. Как можно сохранить клавиатуру за этим предупреждением, что означает, что текстовое поле все еще редактируется, даже если взаимодействие будет невозможно?


person Sam    schedule 17.02.2015    source источник


Ответы (2)


Это решение работает для меня:

let rootViewController: UIViewController = 
    UIApplication.sharedApplication().windows.lastObject.rootViewController!!
rootViewController.presentViewController(alert, animated: true, completion: nil)

отредактировано @galambalazs: Причина, по которой это работает, заключается в том, что:

Вы можете захватить окно с текущим самым высоким уровнем окна и представить свой Контроллер представления внутри этого Окна (сделав его верхним Контроллером представления в верхней части окна). Окно).

UIApplication.sharedApplication(). windows
Окна в массиве упорядочены сзади наперед по уровню окна;
таким образом, последнее окно в массиве находится поверх всех других окон приложения.

Также вы можете установить tintColor этого окна так, чтобы он соответствовал глобальному оттенку ваших приложений.

UIWindow *topWindow = [UIApplication sharedApplication].windows.lastObject;
// we inherit the main window's tintColor because topWindow may not have the same
topWindow.tintColor = [UIApplication sharedApplication].delegate.window.tintColor;
person Sam    schedule 24.02.2015
comment
Похоже, что это использует окно, в котором находится строка состояния, для представления контроллера предупреждений, верно? - person ninjudd; 03.06.2015
comment
На самом деле, я был неправ. Второе окно в UIAppplication.sharedApplication().windows — это UITextEffectsWindow. - person ninjudd; 03.06.2015
comment
После дополнительных исследований я обнаружил, что UITextEffectsWindow — это место, где находится представление клавиатуры (или UIViewController inputAccessoryView). Таким образом, это второе окно будет существовать только в том случае, если была отображена клавиатура. fantageek.com/1317/uiwindow-in-ios - person ninjudd; 03.06.2015
comment
Так что это сработало для меня. Хотя фон становится черным, и это нехорошо, если вы используете эффект в качестве фона (используя представление фактического контроллера представления). Также переход не очень хорош (т.к. заменяет фактический вид черным фоном). Все еще ищу лучшее решение... - person Tzegenos; 08.09.2015
comment
Я думаю, вы должны использовать UIApplication.sharedApplication().windows.lastObject.rootViewController, тогда код будет работать независимо от того, отображается ли клавиатура или скрывается. - person smoothdvd; 18.09.2015
comment
Есть ли другой способ, кроме доступа к внутренней иерархии окон? - person NYC Tech Engineer; 30.12.2015
comment
Спасибо. Решение хорошо работало только в iOS 8, но не работает в iOS 9. Также обратите внимание, что в ответе есть лишний ! в конце, который не нужен. со Свифт 2.1 - person Zhao; 09.02.2016
comment
Решение @smoothdvd хорошо работает для iOS 9 и 8. Хотя в iOS 8 иногда случаются сбои. Изучаем проблему. - person Zhao; 09.02.2016
comment
следует ли lastObject заменить на last? - person He Yifei 何一非; 20.06.2016

Для Swift 3 и iOS11

if let alertWindow = UIApplication.shared.windows.last, alertWindow.windowLevel == 10000001.0 // If keyboard is open
  { // Make sure keyboard is open
    alertWindow.rootViewController?.present(alertController, animated: true, completion: nil)
  }
  else
  {
    viewController?.present(alertController, animated: true, completion: nil)
  }
person Hiren Panchal    schedule 02.11.2017