NSTextField で一部のキーボード レイアウト (入力ソース) をブロックする方法はありますか。
ロシア語、ベラルーシ語、ウクライナ語など、ローマ以外の言語をすべてブロックするか、すべての言語を無効にして英語/ドイツ語のみを有効にする必要があります。
それほど難しくない場合は、例をいくつか作成してください。
更新:
これを使う必要があると思います
しかし、どのように?=)
接続されているキーボードだけをチェックするのは、少し不安定かもしれません。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: