2012-06-16 61 views
1

有沒有辦法阻止NSTextField中的一些鍵盤佈局(輸入源)。如何阻止NSTextField中的某些鍵盤佈局?

我需要阻止所有非羅馬語言(如俄語,白俄羅斯語,烏克蘭等),或者禁用所有語言,並且只啓用英語/德語。

如果它不會那麼難 - 請舉一些例子。

UPD:

我想我需要使用this

但如何? =)

回答

0

檢查只是連接的鍵盤可能有點flakey。例如,使用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; 
} 

當繼承NSFormatter您還需要實現stringForObjectValue:getObjectValue:forString:errorDescription: ,但是由於您輸入了一個字符串,他們可以直接傳遞輸入字符串。

+0

它不是很聰明解決我需要=) – Kira