2015-01-28 1 views
1

NSTextField에 중점을두고 시스템 입력 언어를 변경하려고합니다. 영어, 러시아어 및 체코 어 (QWERTY)의 3 가지 입력 언어가 있습니다.TIS 서비스 : 체코 어 선택

나는이 방법을 사용

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

를 그리고 러시아와 함께 잘 작동,하지만 체코어로 ... 체코 언어 태그는 러시아어, cs입니다 - ru. 두 시간 전 출력을 체코어에 대한

NSLog("%@", ref);  

인쇄 뭔가를 만들었지 만 지금은 단지 (null) 인쇄합니다. QWERTY가 아닌 QWERTY를 정확히 사용하고 싶지만 체코 QWERTY 레이아웃을 나타내는 태그를 어디에도 찾을 수 없습니다. Apple 설명서에 :

입력 소스가 두 개 이상이고 하나 이상이 인 경우 가장 최근에 사용한 입력 소스가 선택됩니다.

그러나 항상 영어가 아닌 체코 어를 선택합니다! 그리고 콘솔에서, 전에 말했듯이, (null)을 인쇄합니다. 그래서 체코 어를 선택하기 위해 무엇을 사용해야합니까? 이걸하는 데 약 3 시간을 잃어 버렸어. 제발, 도와 줘.

답변

0

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; 
} 

마음이 당신을, 사용자의 허가없이 입력 소스를 활성화하는 것은 사용자에게 적대적인 행위입니다.

+0

정말 고마워요! 그것은 inputSourceID를 사용하면 멋지게 작동합니다! P. S. 나는 새로운 단어를 배우기 위해 체코 - 러시아 카드를 입력하기 위해서만이 앱을 작성합니다.그래서 lang이 자동으로 변경되면 매우 유용합니다. 그리고 다시 : 감사합니다! – mannannlegur