How to limit NSTextField text length and keep it always upper case?

后端 未结 6 1460
无人及你
无人及你 2020-12-01 02:47

Need to have an NSTextField with a text limit of 4 characters maximum and show always in upper case but can\'t figure out a good way of achieving that. I\'ve tried to do it

6条回答
  •  执笔经年
    2020-12-01 03:38

    I did as Graham Lee suggested and it works fine, here's the custom formatter code:

    UPDATED: Added fix reported by Dave Gallagher. Thanks!

    @interface CustomTextFieldFormatter : NSFormatter {
      int maxLength;
    }
    - (void)setMaximumLength:(int)len;
    - (int)maximumLength;
    
    @end
    
    @implementation CustomTextFieldFormatter
    
    - (id)init {
    
       if(self = [super init]){
    
          maxLength = INT_MAX;
       }
    
      return self;
    }
    
    - (void)setMaximumLength:(int)len {
      maxLength = len;
    }
    
    - (int)maximumLength {
      return maxLength;
    }
    
    - (NSString *)stringForObjectValue:(id)object {
      return (NSString *)object;
    }
    
    - (BOOL)getObjectValue:(id *)object forString:(NSString *)string errorDescription:(NSString **)error {
      *object = string;
      return YES;
    }
    
    - (BOOL)isPartialStringValid:(NSString **)partialStringPtr
       proposedSelectedRange:(NSRangePointer)proposedSelRangePtr
              originalString:(NSString *)origString
       originalSelectedRange:(NSRange)origSelRange
            errorDescription:(NSString **)error {
        if ([*partialStringPtr length] > maxLength) {
            return NO;
        }
    
        if (![*partialStringPtr isEqual:[*partialStringPtr uppercaseString]]) {
          *partialStringPtr = [*partialStringPtr uppercaseString];
          return NO;
        }
    
        return YES;
    }
    
    - (NSAttributedString *)attributedStringForObjectValue:(id)anObject withDefaultAttributes:(NSDictionary *)attributes {
      return nil;
    }
    
    @end
    

提交回复
热议问题