我专注于NSTextField之后尝试更改系统输入语言。我在系统中有3种输入语言:英语,俄语和捷克语(QWERTY)。

我使用这种方法:

TISInputSourceRef ref = TISCopyInputSourceForLanguage(CFSTR("cs"));
TISSelectInputSource(ref);


它对俄语非常有效,但对捷克语则无效。捷克语标记为cs,俄语为-ru。两个小时前我做了输出

NSLog("%@", ref);


打印有关捷克语的内容,但现在仅打印(null)。我想使用完全QWERTY,而不是QWERTZ,但是我真的找不到任何表示捷克QWERTY布局的标签。苹果文档说:


  如果存在多个这样的输入源,并且至少有一个
  使用时,选择最近使用的输入源。


但是它总是选择英语,而不是捷克语!就像我之前说过的那样,在控制台中,它会显示(null) ...那么选择捷克语该怎么用呢?我这样做已经浪费了大约3个小时...请帮助。

最佳答案

我可以确认TISCopyInputSourceForLanguage()的行为不符合预期。您应该向Apple提交错误报告。

有一些解决方法,但是首先:您是否尝试设置文本字段单元格的allowedInputSourceLocales属性?由于指定了语言环境,因此我不确定是否将输入限制为仅捷克语,选择捷克语输入源或特别选择捷克语-QWERTY输入源,但这值得一试。

如果那没有帮助,那么我会为TISCopyInputSourceForLanguage()失败时编写备用代码。复制所有启用的键盘布局输入源的列表,然后在其中搜索支持捷克语作为一种语言的源。

TISInputSourceRef ref = TISCopyInputSourceForLanguage(CFSTR("cs"));

if (!ref)
{
    NSDictionary* properties = @{ (__bridge NSString*)kTISPropertyInputSourceCategory: (__bridge NSString*)kTISCategoryKeyboardInputSource,
                                  (__bridge NSString*)kTISPropertyInputSourceType: (__bridge NSString*)kTISTypeKeyboardLayout,
                                  (__bridge NSString*)kTISPropertyInputSourceIsSelectCapable: @YES,
                                  };
    NSArray* sources = CFBridgingRelease(TISCreateInputSourceList((__bridge CFDictionaryRef)properties, NO));
    for (id sourceObj in sources)
    {
        TISInputSourceRef source = (__bridge TISInputSourceRef)sourceObj;
        NSArray* langs = (__bridge NSArray*)TISGetInputSourceProperty(source, kTISPropertyInputSourceLanguages);
        if ([langs containsObject:@"cs"])
        {
            ref = source;
            break;
        }
    }
}

TISSelectInputSource(ref);


您可以通过查找语言数组中最早出现“ cs”的源(如果有多个源支持的话)来扩展它。

即使这样也不能保证您会获得捷克输入源的QWERTY变体。具体来说,如果您真的想要那个,则应该使用其输入源ID,即“ com.apple.keylayout.Czech-QWERTY”。

要找到一个,您可以使用:

NSDictionary* properties = @{ (__bridge NSString*)kTISPropertyInputSourceID: @"com.apple.keylayout.Czech-QWERTY" };
NSArray* sources = CFBridgingRelease(TISCreateInputSourceList((__bridge CFDictionaryRef)properties, NO));
TISInputSourceRef source = (__bridge TISInputSourceRef)sources.firstObject;


但是,您应该为不启用甚至不安装该输入源做好准备。 (Apple可能会更改其Czech-QWERTY布局以使用其他标识符或其他标识符。)如果已安装但未启用它,则可以通过在上述代码后添加以下代码来找到它:

if (!source)
{
    properties = @{ (__bridge NSString*)kTISPropertyInputSourceID: @"com.apple.keylayout.Czech-QWERTY",
                    (__bridge NSString*)kTISPropertyInputSourceIsEnableCapable: @YES };
    sources = CFBridgingRelease(TISCreateInputSourceList((__bridge CFDictionaryRef)properties, YES));
    source = (__bridge TISInputSourceRef)sources.firstObject;

    if (source && TISEnableInputSource(source) != noErr)
        source = NULL;
}


请注意,在未经用户许可的情况下启用输入源是对用户不利的。

07-24 20:26