一、前言
今天做手机号输入限制长度,例如我的textfield只能输入11位,如果再多输入的话就不再textfield中显示,只显示11位的手机号。
如果用ReactiveCocoa的话,这个很好解决。但是项目中没有引入该类库,所以只能手动的取完成了。
二、实现原理
先看代码:
// // ViewController.m // Test // // Created by zhanggui on 15/12/28. // Copyright © 2015年 zhanggui. All rights reserved. // #import "ViewController.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UITextField *myTextField; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFiledEditChanged:) name:@"UITextFieldTextDidChangeNotification" object:self.myTextField]; self.myTextField.placeholder = @"只能输入11位哦"; // Do any additional setup after loading the view, typically from a nib. } #pragma mark - UITextFieldDelegate -(void)textFiledEditChanged:(NSNotification *)obj{ UITextField *textField = (UITextField *)obj.object; NSString *toBeString = textField.text; if (toBeString.length-1 > 10 && toBeString.length>1) { textField.text = [toBeString substringToIndex:11]; } } @end
做法如下:
首先,我们需要添加一个通知,这个通知的name是:UITextFieldTextDidChangeNotification 。我们可以点击这个名字进去,会发现
UIKIT_EXTERN NSString *const UITextFieldTextDidChangeNotification;
这个是在UITextField.h中定义的一个常量字符串,他的作用如下:
通知观察者textField中的内容改变了,受影响的textField就存储在通知的object参数中。(Notifies observers that the text in a text field changed. The affected text field is stored in the object parameter of the notification.)
这样的话,我们就可以通过通知来控制了。当我们每次输入字符到textField中的时候,都会在通知的方法中进行监听,我就在里面判断输入的字符串的长度是否满足需要的条件,如果满足了条件(我这里的条件是11位),就让textField的text始终等于我要限制的长度。以此来完成自己的需求。
=========== =========== =========== =========== =========== =========== ===========
2015年12月31日下午5:57更新
另一个简单的方法:代码如下:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { NSString *toBeString = [textField.text stringByReplacingCharactersInRange:range withString:string]; if ([toBeString length] > 11) { textField.text = [toBeString substringToIndex:11]; return NO; } return YES; }