UITextField - 防止用户输入非标准字符(如表情符号)

Posted

技术标签:

【中文标题】UITextField - 防止用户输入非标准字符(如表情符号)【英文标题】:UITextField - Prevent user from typing non-standard characters (like Emoticons) 【发布时间】:2013-02-10 17:17:23 【问题描述】:

我的应用程序创建 EKEvents 并将其存储到标准日历数据库中,但是,我发现如果我使用表情符号作为事件的“注释”,则在尝试读取事件时会导致崩溃日历。

我不想要需要event.notes 中使用表情符号。我只是碰巧在测试,当它让我保存事件时有点震惊。 (表情符号甚至出现在日历本身)

所以我认为我的问题可以通过两种方式之一解决,但我都无法弄清楚。

1) 我可以禁用或隐藏自定义键盘按钮吗?

2) 如果不是,我如何创建一个字符集,其中包含所有标准键盘中所有可能的字符,以便在确保用户没有键入表情符号时进行检查?

我尝试使用一些标准字符集进行检查,例如 alphanumericCharacterSet,但使用它,我无法输入空格。

这是我目前使用的代码,用于检查用户输入的字符:

- (BOOL)textField:(UITextField *)theTextField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

    if (string.length == 0) 
        return YES;
    

    NSCharacterSet *myCharSet = [NSCharacterSet alphanumericCharacterSet];
    for (int i = 0; i < [string length]; i++) 
        unichar c = [string characterAtIndex:i];
        if ([myCharSet characterIsMember:c]) 
            return YES;
        
    

    UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"Invalid Input" message:@"Oops! You can't use that character." delegate:self cancelButtonTitle:@"Dismiss" otherButtonTitles:nil];
    [av show];
    return NO;

编辑:错误说明

没有错误,只有崩溃。 我的应用程序保存日历事件,并将它们显示在列表中给用户。 然后用户可以将事件标记为“付费”或“未付费”,此时我将一个字符串附加到事件“-付费”的.notes 属性。因此,当我重新加载表格时,如果事件已付费,它会向用户显示特定图标。 当保存的甚至有一个表情符号作为.notes 属性时,就会发生崩溃,我尝试附加.notes

【问题讨论】:

如果活动笔记中有 Emoji 字符会出现什么错误?您最好的解决方案可能是解决该问题。 @rmaddy 这不是错误,他只是不想要它,干净的文本会被有趣的图标污染 @rmaddy,请参阅我的编辑。我解释了到底发生了什么。 @jhilgert00 不,这不能回答我的问题。崩溃中显示的实际错误是什么?你看过堆栈跟踪吗?您可能有一个可以修复的简单错误。 好的,等一下。一定要给你.... 【参考方案1】:

您可以使用联合来组合NSCharacterSets 以添加更多允许的字符:

    NSMutableCharacterSet *myCharSet = [[NSCharacterSet alphanumericCharacterSet] mutableCopy];
    [myCharSet formUnionWithCharacterSet:[NSCharacterSet whitespaceAndNewlineCharacterSet];

以下是可供选择的可用字符集列表:

controlCharacterSet
whitespaceCharacterSet
whitespaceAndNewlineCharacterSet
decimalDigitCharacterSet
letterCharacterSet
lowercaseLetterCharacterSet
uppercaseLetterCharacterSet
nonBaseCharacterSet
alphanumericCharacterSet
decomposableCharacterSet
illegalCharacterSet
punctuationCharacterSet
capitalizedLetterCharacterSet
symbolCharacterSet
newlineCharacterSet

此外,您的代码正在检查以确保 any 字符不在集合之外;我认为您的意图是检查 所有 字符是否不在集合之外。 (这仅适用于用户一次输入多个字符时 - 考虑复制和粘贴)。

考虑调整你的循环看起来更像这样:

NSCharacterSet *myCharSet = [NSCharacterSet alphanumericCharacterSet];
for (int i = 0; i < [string length]; i++) 
    unichar c = [string characterAtIndex:i];
    if ([myCharSet characterIsMember:c] == NO) 
        // add your user alert here
        return NO;
    

这样你的循环不会简单地在它找到的第一个好字符上退出;相反,它将在第一个坏字符处退出。

【讨论】:

只使用-rangeOfCharacterFromSet: 比自己迭代unichars 更容易。

以上是关于UITextField - 防止用户输入非标准字符(如表情符号)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中防止 UITextField 中出现空白或空格?

UITableViewCell 内的 UITextField - 防止文本重置的方法

防止用户使用 jQuery 在文本框中输入非数字 [重复]

如何允许用户在 UITextField 中输入法文字符? [关闭]

如何在 viewDidLoad 上的 Swift 中显示没有 UITextField 的标准数字键盘

如何在 PHP 中一起添加货币字符串(非标准化输入)?