UITextfield+NLLimit.m 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. #import "UITextfield+NLLimit.h"
  2. #import <objc/runtime.h>
  3. @implementation UITextField (NLLimit)
  4. static void *nlLimitMaxLengthKey = &nlLimitMaxLengthKey;
  5. - (void)setNl_maxLength:(NSUInteger)nl_maxLength {
  6. objc_setAssociatedObject(self, nlLimitMaxLengthKey, @(nl_maxLength), OBJC_ASSOCIATION_COPY);
  7. /**
  8. * 监控自身文本变化
  9. */
  10. if (nl_maxLength > 0) {
  11. [self addTarget:self action:@selector(_nl_valueChanged:) forControlEvents:UIControlEventAllEditingEvents];
  12. } else {
  13. [self removeTarget:self action:@selector(_nl_valueChanged:) forControlEvents:UIControlEventAllEditingEvents];
  14. }
  15. }
  16. - (NSUInteger)nl_maxLength {
  17. return [objc_getAssociatedObject(self, nlLimitMaxLengthKey) unsignedIntegerValue];
  18. }
  19. #pragma mark - private
  20. - (void)_nl_valueChanged:(UITextField *)textField {
  21. /**
  22. * 在文本变化后判断文本长度是否符合需求
  23. */
  24. if (self.nl_maxLength == 0) return;
  25. if ([textField.text length] <= self.nl_maxLength) return;
  26. NSString *subString = [textField.text substringToIndex:self.nl_maxLength];
  27. dispatch_async(dispatch_get_main_queue(), ^{
  28. textField.text = subString;
  29. [textField sendActionsForControlEvents:UIControlEventEditingChanged];
  30. });
  31. }
  32. @end