上两篇简述了UITextField的属性及方法和简单使用,本篇实际应用实现限制字符长度,中文汉字及中文符号算两位,英文和数字算一位。
具体属性及方法可以参考:
UITextField简介:UITextField简介
UITextField实用实现手机账号3位4位4位格式:UITextField实用实现手机账号344格式
实例直接上代码:
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@end
#import "ViewController.h"
struct HWTitleInfo {
NSInteger length;
NSInteger number;
};
typedef struct HWTitleInfo HWTitleInfo;
@interface ViewController ()
@property (nonatomic, strong) UITextField *login;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
//创建控件
[self creatControl];
}
- (void)creatControl
{
//lable
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(30, 100, 60, 30)];
label.text = @"账号:";
[self.view addSubview:label];
//账号textField初始化
self.login = [[UITextField alloc] initWithFrame:CGRectMake(100, 100, 200, 30)];
//提醒文字
_login.placeholder = @"请输入账号";
//边界样式
_login.borderStyle = UITextBorderStyleRoundedRect;
//textField变化时事件
[_login addTarget:self action:@selector(textFieldEditingChanged:) forControlEvents:UIControlEventEditingChanged];
[self.view addSubview:_login];
}
//点击空白区域,隐藏键盘
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//结束编辑
[self.view endEditing:YES];
}
//限制标题长度,数字及英文1,中文及中文符号2
- (void)textFieldEditingChanged:(UITextField *)textField
{
NSInteger maxLength = 10;
HWTitleInfo title = [self getInfoWithText:textField.text maxLength:maxLength];
if (title.length > maxLength) {
textField.text = [textField.text substringToIndex:title.number];
}
}
//判断中英混合的的字符串长度及字符个数
- (HWTitleInfo)getInfoWithText:(NSString *)text maxLength:(NSInteger)maxLength
{
HWTitleInfo title;
int length = 0;
int singleNum = 0;
int totalNum = 0;
char *p = (char *)[text cStringUsingEncoding:NSUnicodeStringEncoding];
for (int i = 0; i < [text lengthOfBytesUsingEncoding:NSUnicodeStringEncoding]; i++) {
if (*p) {
length++;
if (length <= maxLength) {
totalNum++;
}
}
else {
if (length <= maxLength) {
singleNum++;
}
}
p++;
}
title.length = length;
title.number = (totalNum - singleNum) / 2 + singleNum;
return title;
}
@end