Решение
Вот полное решение / обходной путь для этой проблемы, пожалуйста, проголосуйте также за ответ Blld, потому что это была необходимая информация!
Альтернативные названия, чтобы помочь поиску
- Отображение клавиатуры Emoji по умолчанию для объекта UIKeyInput (в iOS 13)
- Заставьте iOS 13 показать клавиатуру Emoji
- Настройка
UITextInputMode.primaryLanguage
смайликов - Программно установить клавиатуру на смайлики
До ios13 Возвращая UITextInputMode
с primaryLanguage
этими составившими «смайликами» по умолчанию будет показывать клавиатуры Emoji (смотрите изображение ниже).
Пример кода для возврата "emoji" UITextInputMode
.
//
// ViewController.swift
// Keyboard Info
//
// Created by Richard Stelling on 30/09/2019.
// Copyright © 2019 Richard Stelling. All rights reserved.
//
import UIKit
class TestButton: UIButton, UIKeyInput {
var hasText: Bool = true
func insertText(_ text: String) { print("\(text)") }
func deleteBackward() {}
override var canBecomeFirstResponder: Bool { return true }
override var canResignFirstResponder: Bool { return true }
override var textInputMode: UITextInputMode? {
for mode in UITextInputMode.activeInputModes {
if mode.primaryLanguage == "emoji" {
return mode
}
}
return nil
}
}
Запуск этого кода на iOS 12 приведет к установке клавиатуры на систему Emoji Keyboard, но на iOS 13 это никак не повлияет.
Это известная ошибка? Есть ли обходной путь?
Обновления
- Запрашивается @Navillus , полный список «активных режимов ввода»: "en-GB", "emoji"
- Проверено и подтверждено на; 13.0, 13.1, 13.1.1, 13.1.2 и 13.2 (семя 1)
Ответы:
Я подал радар об этом для iOS 13, потому что у меня есть двуязычное японское / английское приложение. Некоторые поля - японские, а некоторые - английские, поэтому, очевидно, имеет смысл представить пользователю правильный тип клавиатуры, а не переворачивать их назад и вперед 20 раз.
Был обходной путь для этого, и это было то, что после того, как UIKit вызывает textInputMode, в главном потоке вы можете сделать это:
Это заставляет клавиатуру перезагружаться после ответа нужным вам textInputMode. Я проинформировал их об ошибке и обходном пути, чтобы получить правильное поведение.
Так что в iOS 13.1 ошибка не была исправлена, однако они заблокировали мой обходной путь.
Ницца. Я не буду сообщать им об ошибках снова. Скорее, если я найду обходной путь, я просто буду его использовать.
Похоже, что сейчас они молча отключают эту функцию. И это особенность, это буквально цель этого вызова метода, чтобы выяснить, какой режим ввода должен быть представлен пользователю.
Это все еще работает нормально, если у вас есть другой язык и вы хотите выбрать английский.
Так что, если мой пользователь установит японский язык в качестве выбора клавиатуры, я смогу включить английскую клавиатуру. Просто не наоборот. Любые попытки получить японский режим ввода заканчиваются на английской клавиатуре.
РЕДАКТИРОВАТЬ:
Есть еще один путь, который вы можете обойти, но он включает в себя обнаружение и использование внутреннего API, который не является простым. Вы должны были бы по существу найти функции, используемые для управления результатами нажатия кнопки глобуса. Если вы сделаете это, вы по сути будете имитировать нажатия пользователя, и у него будет широкий спектр эффектов, то есть клавиатура будет заменена и для других приложений. Так что это не рекомендуется, 100% это не получится в App Store. Я не хочу публиковать его из-за результатов моего последнего обходного пути.
Я думаю, что понять Apple не так просто. Все, что я знаю, это что:
Поэтому будущие обходные пути следует скрывать до тех пор, пока их намерения не станут ясными и / или они не исправят эту ошибку (что они и должны делать). Простая отмена части API без публикации изменений является серьезной ошибкой.
источник
Похоже, что это ошибка iOS 13, обходной путь (для устройств, это не влияет на симулятор) - переопределить
textInputContextIdentifier
свойство и вернуть значение, отличное от nil.источник
Вам нужно установить
textinputcontextidentifier
на textField, чтобы iOS знала, где сохранить пользовательскийtextInputMode
Это не написано в документе, но это работает.
ссылка: https://developer.apple.com/documentation/uikit/uiresponder/1621091-textinputcontextidentifier
источник
"emoji"
или""
дляtextInputContextIdentifier
в моих пользовательскихUITextField
показывает клавиатуру Emoji (в сочетании сtextInputMode
переопределения в вопросе). Спасибо за совет по скрытым документам. 👍