iOS

iOS-TextField小结

2020-05-06  本文已影响0人  贵叔勇闯天涯

一、TextField 基本介绍和用法

UITextField 是一个用来处理文本输入和现实的控件

基本属性,对象创建以及文本的显示

UITextField *textField = [[UITextField alloc]initWithFrame:CGRectMake(50, 300, 200, 50)];
[self.view addSubView:textField];
//设置显示文本
textField.text = @"点击试试";
//设置文本颜色
textField.textColor = [UIColor redColor];
//设置文本对齐方式
textField.textAlignment = NSTextAlignmentRight;
//设置字体
textField.font = [UIFont fontWithName:@"wawati sc" size:20];

其他属性

设置TextField的边框

textField.borderStyle = UITextBorderStyleRoundedRect;

borderStyle 是一个枚举类型的属性, 默认是:UITextBorderStyleNone, 该枚举的所有成员如下:

  • 无边框

    UITextBorderStyleNone

  • 直线边框

    UITextBorderStyleLine

  • 凹边框

    UITextBorderStyleBezel

  • 圆角边框

    UITextBorderStyleRoundedRect

对于以上几种边框样式最好去一一试试,看看效果

设置TextField的占位字符

textField.placeholder = @"看看";

设置TextField的占位字符

在App中有很多情况需要让编辑框不能编辑,我们通过设置enabled来控件可不可以编辑

textField.enabled = YES;

设置TextField的编辑状态

在App中有很多情况需要让编辑框不能编辑,我们通过设置enabled来控件可不可以编辑

textField.enabled = YES;

设置编辑框中删除按钮的出现模式

我们在使用App时经常会看到当我们的编辑框中有文本的时候,边上会很出现一个删除的图标,当我们不需要框中的内容的时候直接点击按钮就可以把整个框中的内容删掉;在iOS中这个按钮是系统自带的,我们来设置下他的出现模式

textField.clearButtonMode = UITextFieldViewModeAlways;

clearButtonMode是一个枚举类型的属性,默认是:UITextFieldViewModeNever, 该类型的所有成员如下:

  • 没有删除按钮

    UITextFieldViewModeNever

  • 当编辑的时候出现删除按钮

    UITextFieldViewModeWhileEditing

  • 当不编辑的时候出现删除按钮

    UITextFieldViewModeUnlessEditing

  • 总是出现

    UITextFieldViewModeAlways

设置开始编辑时是否删除原有内容

有时候我们需要再次编辑时删除框中原有内容,如果每次都手动的删除原有内容特别麻烦,我们可以进行如下设置:

textField.clearsOnBeginEditing = YES;

设置为YES后,当再次点击编辑框时,会将上次的内容清空

设置编辑框中的内容密码显示

textField.secureTextEntry = YES;

设置键盘样式

textField.keyboardType = UIKeyboardTypeNamePhonePad;

键盘的样式非常多,大家可以查看我的

设置键盘上return键的类型

textField.returnKeyType = UIReturnKeySearch;

  • UIReturnKeyDefault,
  • UIReturnKeyGo,
  • UIReturnKeyGoogle,
  • UIReturnKeyJoin,
  • UIReturnKeyNext,
  • UIReturnKeyRoute,
  • UIReturnKeySearch,
  • UIReturnKeySend,
  • UIReturnKeyYahoo,
  • UIReturnKeyDone,
  • UIReturnKeyEmergencyCall,

以上样式,可以一一试试,只有查看了之后才能跟好的理解

自定义键盘辅助视图

在键盘的最上面有一个辅助视图,我们可以通过自定义这个辅助视图实现很多很灵活的功能,下面我举一个非常简单的例子:

<pre>
//自定义键盘辅助视图
UIView *subView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 80)];
subView.backgroundColor = [UIColor greenColor];
textField.inputAccessoryView = subView;
</pre>
先创建一个视图,然后赋值给inputAccessoryView属性就可以了,这样键盘上的辅助视图就是我们创建的绿色View了

自定义键盘

为了安全着想,现在越来越多的项目中都使用了自定义的键盘;在iOS中键盘的自定义相对来说比较简单,因为系统给我们提供了接口,我们只要自己创建一个键盘视图,然后覆盖当前编辑框的键盘视图就可以:

<pre>

//自定义键盘视图
UIView *redView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 100)];
redView.backgroundColor = [UIColor redColor];
textField.inputView = redView;

</pre>

添加编辑框的左/右边视图

编辑框的设计非常的灵活, 我们自己可以在编辑框的左边再添加一个自定义的视图;

先设置左视图出现的模式

textField.leftViewMode = UITextFieldViewModeAlways;

leftViewMode这也是一个枚举类型的属性,他的成员我就不一一列举了,大家可以自己去头文件中查看,他的枚举成员的大概和删除按钮出现的的意思一样

设置左边要出现的视图

<pre> //添加左视图
UIView *leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];
leftView.backgroundColor = [UIColor grayColor];
textField.leftView = leftView;
</pre>

image

上面是添加左视图,其实添加右视图是一样的原理,只是设置的是右边两个相关的属性(rightViewModerightView)

编辑框的代理方法

既然编辑框是一个处理文本的控件,那免不了我们要和用户进行打交道;例如我们要在用户开始输入的、正在输入或者输入结束等等情况下进行一些特殊的处理;那么这些处理的话,编辑框本身并不知道我们具体要做什么处理,所以我们可以作编辑框的代理,让我们自己来做处理;

设置编辑框的代理

先遵守编辑框代理协议(UITextFieldDelegate),然后设置代理
textField.delegate = self;

实现代理方法

具体代理方法如下:

 // textField delegate
 // return button Action
 -(BOOL)textFieldShouldReturn:(UITextField *)textField
 {
   //textField:调用次方法的textField
   NSLog(@"点击return 按钮时会执行的方法");
   [textField resignFirstResponder]; //回收键盘
   return YES;
 }
// Had Begin Editing Action
 -(void)textFieldDidBeginEditing:(UITextField *)textField
 {
 NSLog(@"已经开始编辑文本框时执行的方法%@", textField.text);
 }
 // Had End Editing Action
 -(void)textFieldDidEndEditing:(UITextField *)textField
 {
 NSLog(@"已经结束编辑时执行的方法%@", textField.text);
 }
 // will begin Editing Action
 -(BOOL)textFieldShouldBeginEditing:(UITextField *)textField
 {
 NSLog(@"将要开始编辑时执行的方法%@", textField.text);
 //系统是否响应这个动作
 return YES;
 }
 // Will End Editing Action
 -(BOOL)textFieldShouldEndEditing:(UITextField *)textField
 {
   NSLog(@"将要结束编辑时执行的方法%@", textField.text);
   return YES;
 }
 // Will Text Change Action
 -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
 {
   NSLog(@"将要被改变的范围:%ld, %ld", (long)range.location, (long)range.length);
   NSLog(@"将要改变的文本:%@", string);
   NSLog(@"%@", textField.text); 
   return YES;
}
// clear button Action
-(BOOL)textFieldShouldClear:(UITextField *)textField
{
  NSLog(@"将被清空时执行的方法%@", textField.text);
  return YES;
}

二、TextField 关于中文字数限制包含表情

-(BOOL)textField:(UITextField )textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString )string;

用这个方法来进行字数限制,但是这个方法到现在也不能限制中文,这个方法给我最多的就是用在做限制手机号码等纯数字或者密码输入等数字英文字符的限制

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldEditChanged:) name:UITextFieldTextDidChangeNotification object:self.textField.text];

NSInteger length;//定义length来保存字数
-(void)textFieldEditChanged:(UITextField *)textField
{
    //字数限制
    NSInteger WordCount = 10;
    NSString *toBeString = textField.text;
    UITextRange *selectedRange = [textField markedTextRange];
    UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];
    // 没有高亮选择的字,则对已输入的文字进行字数统计和限制
    if (!position)
    {
        if (toBeString.length > WordCount && textField.markedTextRange == nil)
        {
            NSRange rangeIndex = [toBeString rangeOfComposedCharacterSequenceAtIndex:WordCount];
            if (rangeIndex.length == 1)
            {
                textField.text = [toBeString substringToIndex:WordCount];
            }
            else
            {
                textField.text = [toBeString substringWithRange:NSMakeRange(0, length)];
            }
        } else {
            length = toBeString.length;
        }
    }
}
小结:现在对于字数限制,我是比较推荐使用我现在用的这种,符合中文的需求之前其实并没有写那么复杂,只是写了如果大于字数限制,就直接切割多少个字符限制的字符串后来因为发现表情会占用两个字节,如果你最后刚好9个,多一个表情就会变成11,切割变成了10,就会照成表情的不完整,会出现比较严重的bug,在网上综合例子弄了自己最适合的,或许有更好的,欢迎留言~
上一篇下一篇

猜你喜欢

热点阅读