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】:您可以使用联合来组合NSCharacterSet
s 以添加更多允许的字符:
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:
比自己迭代unichar
s 更容易。以上是关于UITextField - 防止用户输入非标准字符(如表情符号)的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Swift 中防止 UITextField 中出现空白或空格?
UITableViewCell 内的 UITextField - 防止文本重置的方法
如何允许用户在 UITextField 中输入法文字符? [关闭]