有没有办法阻止 NSTextField 中的某些键盘布局(输入源)。
我需要阻止所有非罗马语言,例如俄语、白俄罗斯语、乌克兰语等,或禁用所有语言并仅启用英语/德语。
如果不是那么难 - 请举一些例子。
更新:
我想我需要使用this
但是怎么办呢? =)
最佳答案
仅检查连接的键盘可能有点不稳定。例如,使用 Option 键,您可以从任何键盘输入大量非罗马字符。更不用说复制和粘贴了。
更好的方法是创建 NSFormatter
的子类并实现 isPartialStringValid:proposeSelectedRange: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;
}
当子类化 NSFormatter
时,您还需要实现 stringForObjectValue:
和 getObjectValue:forString:errorDescription:
,但由于您输入的是字符串,他们可以直接传递输入字符串。
关于macos - 如何阻止 NSTextField 中的某些键盘布局?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11064760/