objective-c - 如何限制 NSTextField 文本长度并始终保持大写?

标签 objective-c cocoa user-interface nstextfield

需要一个 NSTextField,其文本限制最多为 4 个字符,并且始终以大写字母显示,但无法找到实现该目标的好方法。我尝试通过与验证方法的绑定(bind)来完成此操作,但只有当控件失去第一响应者时才会调用验证,这并不好。

我暂时通过观察文本字段上的通知 NSControlTextDidChangeNotification 并让它调用方法来使其工作:

- (void)textDidChange:(NSNotification*)notification {
  NSTextField* textField = [notification object];
  NSString* value = [textField stringValue];
  if ([value length] > 4) {
    [textField setStringValue:[[value uppercaseString] substringWithRange:NSMakeRange(0, 4)]];
  } else {
    [textField setStringValue:[value uppercaseString]];
  }
}

但这肯定不是最好的方法。有更好的建议吗?

最佳答案

我按照 Graham Lee 的建议做了并且工作正常,这是自定义格式化程序代码:

更新:添加了 Dave Gallagher 报告的修复。谢谢!

@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

关于objective-c - 如何限制 NSTextField 文本长度并始终保持大写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/827014/

相关文章:

java - 线程进度和状态的图形/文本显示

ios - NSPredicate 格式

objective-c - 如何从 JSON 中获取整数

objective-c - KVC : How to test for an existing key

macos - Sparrow 应用程序使用哪些 UI 控件?

iOS - 如何在 UIViewController 中的首选位置显示自定义弹出 View

.NET Compact 框架 - 使滚动条更宽

ios - 带有可点击链接但没有文本突出显示的 UITextView

ios - Toon.shader 找不到 _light 变量

macos - 如何在cocoa中访问finder侧边栏共享​​内容