1

NSTextField で一部のキーボード レイアウト (入力ソース) をブロックする方法はありますか。

ロシア語、ベラルーシ語、ウクライナ語など、ローマ以外の言語をすべてブロックするか、すべての言語を無効にして英語/ドイツ語のみを有効にする必要があります。

それほど難しくない場合は、例をいくつか作成してください。

更新:

これを使う必要があると思います

しかし、どのように?=)

4

1 に答える 1

0

接続されているキーボードだけをチェックするのは、少し不安定かもしれません。Option キーを使用すると、たとえば、どのキーボードからでも多くの非ローマ字を入力できます。コピー&ペーストは言うまでもありません。

より良いアプローチは、サブクラスを作成してNSFormatter実装することですisPartialStringValid:proposedSelectedRange:originalString:originalSelectedRange:errorDescription:

簡単な実装は次のようになります。

- (BOOL)isPartialStringValid:(NSString **)partialStringPtr proposedSelectedRange:(NSRangePointer)proposedSelRangePtr originalString:(NSString *)origString originalSelectedRange:(NSRange)origSelRange errorDescription:(NSString **)error
{
    NSString *partialString = *partialStringPtr;

    NSCharacterSet *acceptedCharacters = [NSCharacterSet characterSetWithCharactersInString: @"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"];

    NSCharacterSet *notAcceptedCharacters = [acceptedCharacters invertedSet];


    BOOL needsCheck = YES;
    BOOL didChange = NO;

    do {
        NSRange rng = [partialString rangeOfCharacterFromSet:notAcceptedCharacters];

        if ( !NSEqualRanges(rng, NSMakeRange(NSNotFound, 0)) ) {

            partialString = [partialString stringByReplacingCharactersInRange:rng withString:@""];

            didChange = YES;
        }
        else {
            needsCheck = NO;
        }

    } while (needsCheck);

    if ( didChange ) {

        *partialStringPtr = partialString;
        NSRange newRange = origSelRange;
        newRange.length = 0;
        *proposedSelRangePtr =newRange;

        return NO;
    }

    return YES;
}

サブクラス化するときはandNSFormatterも実装する必要がありますが、文字列を入力しているため、入力文字列をそのまま渡すことができます。stringForObjectValue:getObjectValue:forString:errorDescription:

于 2012-06-16T17:57:13.183 に答える