2013-02-10 76 views
3

我的应用程序创建和存储EKEvents到标准的日历数据库阻止用户,但是,我发现,如果我用表情的“笔记”的事件,它尝试从日历中读取事件时会导致崩溃。的UITextField - 打字非标准字符(如表情符号)

我不希望需要event.notes使用表情符号。我碰巧正在测试,当它让我保存事件时,我感到非常震惊。

所以我觉得我的问题是可以解决的2路,均未我已经能够找出一个(大头贴甚至在自己的日历显示)。

1)我可以禁用或隐藏的自定义键盘按键? < --I'd喜欢这种解决方案

enter image description here

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的崩溃发生。

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

这里是可用的字符集列表可供选择:

+0

如果事件说明中有表情符号字符,您会得到什么错误?你最好的解决方案可能是解决这个问题。 – rmaddy 2013-02-10 17:19:00

+0

@rmaddy它不是一个错误,他只是不想要它,干净的文本会被有趣的图标 – raceworm 2013-02-10 17:23:55

+0

@rmaddy,请参阅我的编辑。我解释了到底发生了什么。 – jhilgert00 2013-02-10 17:24:51

回答

6

您可以使用工会添加更多的允许的字符组合NSCharacterSet小号

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

这样,你的循环不会简单地就可以找到的第一个人品好退出;相反,它会退出第一个坏字符。

+0

这是一个很好的建议蒂姆,谢谢:) – jhilgert00 2013-02-10 17:35:06

+2

只用'-rangeOfCharacterFromSet:'比自己迭代unichar更容易。 – Tricertops 2013-02-10 18:04:56

+0

好点。正在寻找这方面的东西。 – Tim 2013-02-10 18:17:09

相关问题