3

我的应用程序创建并存储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.

4

1 回答 1

6

您可以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

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

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

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

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

于 2013-02-10T17:29:03.693 回答