3

私のアプリはEKEvents標準のカレンダーデータベースを作成して保存しますが、イベントの「メモ」として絵文字を使用すると、カレンダーからイベントを読み取ろうとするとクラッシュすることがわかりました。

で絵文字を使用したくない、または使用する必要はありませんevent.notes。私はたまたまテストをしていましたが、イベントを保存することができたときはちょっとショックを受けました。(絵文字はカレンダー自体にも表示されます)

ですから、私の問題は2つの方法のいずれかで解決できると思いますが、どちらも理解できませんでした。

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

ユニオンを使用してsを組み合わせ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;
    }
}

このようにして、ループは最初に見つかった適切な文字で終了するだけではありません。代わりに、最初の不良文字で終了します。

于 2013-02-10T17:29:03.693 に答える