TISCopyInputSourceForLanguage()
이 예상대로 작동하지 않는 것을 확인할 수 있습니다. Apple에 버그 리포트를 제출해야합니다.
몇 가지 해결 방법이 있지만 먼저 텍스트 필드 셀의 속성을 설정해 보았습니까? 로케일을 지정하기 때문에 입력을 체코 어로 제한하거나 체코 어 입력 소스를 선택하거나 특히 체코 - 쿼티 입력 소스를 선택할지 여부는 확실하지 않지만 한 번해볼 가치가 있습니다.
그다지 도움이되지 않으면 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 변형을 얻을 수 있다고 보장 할 수 없습니다. 실제로 원한다면 구체적으로 "com.apple.keylayout.Czech-QWERTY"라는 입력 소스 ID를 사용해야합니다.
당신이 사용하는 것, 그 하나를 찾는 방법은 다음과 같습니다
NSDictionary* properties = @{ (__bridge NSString*)kTISPropertyInputSourceID: @"com.apple.keylayout.Czech-QWERTY" };
NSArray* sources = CFBridgingRelease(TISCreateInputSourceList((__bridge CFDictionaryRef)properties, NO));
TISInputSourceRef source = (__bridge TISInputSourceRef)sources.firstObject;
그러나, 당신이 입력 소스가 활성화 또는 아마도 설치할 수 없습니다 할 준비를해야합니다. (애플이 다른 식별자 또는 무언가를 사용하기 위해 체코 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;
}
마음이 당신을, 사용자의 허가없이 입력 소스를 활성화하는 것은 사용자에게 적대적인 행위입니다.
정말 고마워요! 그것은 inputSourceID를 사용하면 멋지게 작동합니다! P. S. 나는 새로운 단어를 배우기 위해 체코 - 러시아 카드를 입력하기 위해서만이 앱을 작성합니다.그래서 lang이 자동으로 변경되면 매우 유용합니다. 그리고 다시 : 감사합니다! – mannannlegur