溶液
这是一个关于这个问题的全面解决办法/工作,请投票给Blld的回答,因为这是所需的重要信息!
辅助搜索的替代标题
UITextInputMode.primaryLanguage
设置为emoji在ios13之前,返回与primaryLanguage
相同的“表情符号”的UITextInputMode
将默认显示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键盘,但在iOS 13上它不会产生任何影响。
这是已知的窃听器吗?有解决办法吗?
更新
发布于 2019-10-24 14:22:37
注意:确保启用了Emoji键盘。
这似乎是一个iOS 13错误,所做的工作(对于设备,这不影响模拟器)是覆盖textInputContextIdentifier
属性并返回一个非零值。
//
// 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
override var textInputContextIdentifier: String? { "" } // return non-nil to show the Emoji keyboard ¯\_(ツ)_/¯
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
}
}
感谢布勒尔德的回答。
发布于 2019-10-03 01:28:32
我为iOS 13设置了一个雷达,因为我有一个双语的日语/英语应用程序。有些字段是日语的,有些是英语的,所以很明显,向用户展示正确的键盘类型是有意义的,而不是让他们来回翻转20次。
有一个解决办法,就是在UIKit调用“textInputMode”之后,在主线程中可以这样做:
// has to be done after the textInputMode method is called
if #available(iOS 13, *) {
textField.keyboardType = textField.keyboardType
}
这将迫使键盘在使用所需的textInputMode进行应答后重新加载。我向他们报告了错误,并提出了解决办法,以获得正确的行为。
因此,在iOS 13.1中,错误没有得到修复,但是他们阻止了我的解决办法。
好的。我不会再向他们报告任何虫子了。相反,如果我找到了解决办法,我就会使用它。
因此,他们现在似乎正在静默地禁用此功能。这是一个特性,这是这个方法调用的字面意义,目的是找出应该给用户提供什么样的输入模式。
不过,如果你有另一种语言,并且想选择英语的话,它仍然可以工作。
因此,如果我的用户将日语设置为键盘选择,那么我可以强制使用英语键盘。只是不是相反的。任何获得日文输入模式的尝试最终都会出现在英语键盘上。
编辑:
还有另一种方法可以解决这个问题,但是它涉及到内部API的发现和使用,这并不简单。您必须从本质上找到用于管理按下地球仪按钮的结果的函数。如果你这样做,你实际上是在模拟用户的水龙头,它有广泛的影响,也就是说,键盘也将改变为其他应用程序。因此,它是不推荐的,100%,它将失败应用商店提交。我不想发布它,因为我的最后一个解决办法的结果。
我认为很难很容易地理解苹果。我只知道:
因此,未来的解决方案应该囤积起来,直到他们的意图明确和/或他们修复这个错误(这是他们应该做的)。简单地撤销部分API而不发布更改是一个主要的错误。
发布于 2019-10-24 08:45:07
您需要在textinputcontextidentifier
上设置textField,以便iOS知道在哪里保存自定义textInputMode
它不是在文档中写的,但它有效。
参考文献:https://developer.apple.com/documentation/uikit/uiresponder/1621091-textinputcontextidentifier
https://stackoverflow.com/questions/58168017
复制相似问题