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

时间:2013-02-10 17:17:24

标签: ios uitextfield uikeyboard nscharacterset

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

想要 需要在event.notes中使用表情符号。我碰巧正在测试,当它让我保存活动时有点震惊。 (表情符号甚至出现在日历中)

所以我认为我的问题可以通过两种解决方式解决,但我都无法解决这个问题。

1)我可以禁用或隐藏自定义键盘按钮吗?< - 我更喜欢这种解决方案

enter image description here

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

我尝试使用某些标准字符集进行检查,例如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

1 个答案:

答案 0 :(得分:6)

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

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

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

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

此外,您的代码正在检查以确保任何字符不在该集合之外;我认为您的目的是检查所有字符是否不在集合之外。 (这仅适用于用户一次输入多个字符的情况 - 请复制并粘贴)。

考虑将循环调整为更像这样:

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;
    }
}

这样你的循环就不会简单地退出它找到的第一个好角色;相反,它将退出第一个坏角色。