有没有选择停止在iOS 8中显示表情符号键盘?它不适用于小键盘和安全文本,但对于电子邮件,它就在那里。 如果无法禁用它如何从表情符号中获取字符串值?
答案 0 :(得分:105)
试试这个:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
if ([textField isFirstResponder])
{
if ([[[textField textInputMode] primaryLanguage] isEqualToString:@"emoji"] || ![[textField textInputMode] primaryLanguage])
{
return NO;
}
}
return YES;
}
有关详细信息,请参阅here。
编辑:
您可以使用以下代码隐藏键盘中的表情符号:
txtField.keyboardType=UIKeyboardTypeASCIICapable;
编辑:
使用“界面”构建器隐藏键盘中的表情符号选择。
答案 1 :(得分:17)
适用于iOS 7和8:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
// Disable emoji input
return [textField textInputMode] != nil;
}
答案 2 :(得分:10)
只是为面对与我相同问题的任何人更新上面的好答案:
我们就是这样做的:
extension String {
func containsEmoji() -> Bool {
for i in self.characters {
if i.isEmoji() {
return true
}
}
return false
}
}
extension Character {
func isEmoji() -> Bool {
return Character(UnicodeScalar(0x1d000)) <= self && self <= Character(UnicodeScalar(0x1f77f))
|| Character(UnicodeScalar(0x1f900)) <= self && self <= Character(UnicodeScalar(0x1f9ff))
|| Character(UnicodeScalar(0x2100)) <= self && self <= Character(UnicodeScalar(0x26ff))
}
}
修改强>
如果你想允许某些字符用于其他语言,那么使用NSASCIIStringEncoding的解决方案就不好了。
使用NSASCIIStringEncoding阻止了一些字母:
如果您想支持来自其他国家/地区的用户,使用NSASCIIStringEncoding不是一个好主意!
我也试过NSISOLatin1StringEncoding:
这要清楚得多。
我也尝试过NSISOLatin2StringEncoding:
更糟。
<强> EDIT2:强>
以下似乎有效:
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
if string.containsEmoji() {
return false
}
//other conditons
}
现在我们打电话:
$mysqli = new mysqli("localhost", "user", "password", "database");
答案 3 :(得分:8)
对我有用的解决方案:
self.texField.keyboardType = UIKeyboardTypeASCIICapable;
表情符号键盘无法使用该KeyboardType。
但是必须检查textField中添加的每个字符的种类,因为用户可以从其他地方复制表情符号,然后将其粘贴。
以下是您可以这样做的方法:
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
return [text canBeConvertedToEncoding:NSASCIIStringEncoding];
}
请注意,正如我在另一篇文章中所读到的那样,这也可能会阻止用户使用带有特殊字符的键盘,例如中文字符。
答案 4 :(得分:6)
在swift 3.0中
textField.keyboardType = .asciiCapable
答案 5 :(得分:5)
虽然问题超级老, 我遇到了同样的问题,并且能够通过这个小技巧加载此页面时解决它:
只需选择&#34; ASCII Capable&#34;或&#34;数字和标点&#34;在Interface Builder Xcode 8.2.1
中
输出为无表情符号键盘= D
我确定它会帮助某人=)
答案 6 :(得分:2)
这是快速版本。
func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {
if textView.isFirstResponder() {
if textView.textInputMode?.primaryLanguage == nil || textView.textInputMode?.primaryLanguage == "emoji" {
return false;
}
}
return true;
}
答案 7 :(得分:2)
我想要一个适用于@GsonTypeAdapterFactory
的Swift 3.0的答案,并提出以下非常简单的方法,可以处理你强加的任何语言(我包含一张照片)用中文来证明)。
guard语句解包可选文本,return语句检查它是否提取了满足shouldChangeTextInRange
检查的值。如果有一个值(意味着它不是当前设备的输入语言的一部分),那么它将不为空,因此该方法返回false并且不允许输入该字符。
trimmingCharacters
这取决于Apple func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
guard let text = (textField.text as NSString?)?.replacingCharacters(in: range, with: string) else {
return true
}
return text.trimmingCharacters(in: CharacterSet.alphanumerics).isEmpty
}
,因此无需维护和更新已批准字符列表,除非您要添加或删除项目。
Yay for language agnostic!
另一个常见用途是电子邮件,因为默认的电子邮件键盘提供了表情符号。我找到了一个小修改,我能够将字符限制为我想要的电子邮件地址。
CharacterSet.alphanumerics
答案 8 :(得分:2)
Swift 3.1解决方案
// MARK: - Text Field Delegate
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
return textField.textInputMode != nil
}
答案 9 :(得分:1)
对于那些需要国际键盘的人来说,这在iOS 9及更高版本上效果很好:
添加以下扩展功能以检查字符串是否包含表情符号:
extension String {
var containsEmoji: Bool {
for scalar in unicodeScalars {
switch scalar.value {
case 0x3030, 0x00AE, 0x00A9,// Special Characters
0x1D000...0x1F77F, // Emoticons
0x2100...0x27BF, // Misc symbols and Dingbats
0xFE00...0xFE0F, // Variation Selectors
0x1F900...0x1F9FF: // Supplemental Symbols and Pictographs
return true
default:
continue
}
}
return false
}
}
另一个扩展功能,用于从字符串中删除表情符号:
extension String {
var minusEmojis: String {
let emojiRanges = [0x1F601...0x1F64F, 0x2702...0x27B0, 0x1D000...0x1F77F, 0x2100...0x27BF, 0xFE00...0xFE0F, 0x1F900...0x1F9FF]
let emojiSet = Set(emojiRanges.joined())
return String(self.filter { !emojiSet.contains($0.unicodeScalarCodePoint) })
}
}
将目标添加到您的文本字段中,如下所示:
textField.addTarget(self, action: #selector(didChangeText), for: .editingChanged)
最后从目标选择器中删除所有出现的表情符号:
@objc func didChangeText(field: UITextField) {
if (field.text?.containsEmoji == true) {
field.text = field.text?.minusEmojis
}
}
希望这对某人有帮助!干杯。
答案 10 :(得分:1)
您可以尝试使用此方法(快速5)。
创建字符串扩展名:
extension String {
func containsEmoji() -> Bool {
for scalar in unicodeScalars {
if !scalar.properties.isEmoji { continue }
return true
}
return false
}
}
然后像这样在UITextFieldDelegate中使用它:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if string.containsEmoji() { return false }
return true
}
答案 11 :(得分:0)
在Swift中: - 它会限制你的TextView中的表情符号,只需将键盘类型更改为支持ascii
func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {
var result = Bool()
let disallowedCharacterSet1 = NSCharacterSet.symbolCharacterSet()
let replacementStringIsLegal = text.rangeOfCharacterFromSet(disallowedCharacterSet1) == nil
result = replacementStringIsLegal
let newLength = textView.text!.utf16.count + text.utf16.count - range.length
return newLength <= 300 && result // Bool
}