2013-02-10 3 views
3

Мое приложение создает и сохраняет EKEvents в стандартной календарной базе данных, однако я обнаружил, что если я использую смайлик как «заметки» для события, это приводит к сбою при попытке прочитать событие из Календаря.UITextField - запретить пользователю вводить нестандартные символы (например, смайлики)

Я не хочу или необходимости использование смайликов в event.notes. Я просто испытал испытания и был шокирован, когда он позволил мне сохранить это событие. (Смайлики даже появляются в самом календаре)

Поэтому я думаю, что моя проблема может быть решена одним из двух способов, ни один из которых я не смог выяснить.

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

EDIT: Разъяснения по ошибке

Там нет ошибки, только крушение. Мое приложение сохраняет события календаря и отображает их в списке для пользователя. Пользователь может затем отметить событие как «Платный» или «Неоплаченный», после чего я добавляю строку к объекту .notes события «Платный». Это происходит, когда я перезаряжаю таблицу, если событие оплачено, оно отображает конкретный значок пользователю. Авария происходит, когда сохраненный даже имеет смайлик как свойство .notes, и я пытаюсь добавить .notes.

+0

Какая ошибка вы получаете, если в примечаниях к событию присутствует символ Эмодзи? Лучшим решением может быть решение этой проблемы. – rmaddy

+0

@rmaddy это не ошибка, он просто не хочет этого, чтобы чистый текст был проголосован смешными значками – raceworm

+0

@rmaddy, см. Мое редактирование. Я точно объяснил, что происходит. – jhilgert00

ответ

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

Таким образом, ваш цикл будет не просто выйти на первый хороший характер он находит; вместо этого он выйдет из первого плохого персонажа.

+0

Это отличное предложение Тима, спасибо :) – jhilgert00

+2

Легче использовать только '-rangeOfCharacterFromSet:', чем итерация 'unichar' самостоятельно. – Tricertops

+0

Хорошая точка. Смотрел что-то в этом направлении. – Tim