欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

iOS基础控件-UITextField

程序员文章站 2022-05-30 13:45:47
...

前几天看博客的时候iOS控件的关系图。iOS基础控件-UITextField
在图上可以看到iOS中所有的视图控件都是UIView的子类。今天要记录的UITextField在图上可以看到并不是UIView的直接子类,而是UIView的子类UIControl的子类。

UITextField介绍

UITextField是文本输入框,这个控件的作用是让用户输入的,前面介绍的基础控件都是展示的,没有说到用户交互,这个控件就涉及到了交互。关于UIView的交互后面再说。这里也是记录一些基础的内容,关于UITextField的一些复杂使用以后再结合项目分析。

UITextField创建

    //UITextField创建 设置位置和大小
    UITextField *field = [[UITextField alloc] initWithFrame:CGRectMake(100, 200, 100, 30)];

这里需要注意一点:UITextField的高度是固定的30 无论在创建还是在frame属性中如何设置都是不变的。

UITextField属性

既然UITextField也是UIView的子类,虽然不是直接子类,但是UIView的通用属性在UITextField中也还是适用的,这里就不重复介绍了。
1、text属性
UITextField是一个输入框,所以内容就是最重要的,text属性就是UITextField中输入的文字,默认为nil。
在创建UITextField时若需要在初始在输入框中展示文字就可以使用text属性进行赋值。在后面的程序中若想要使用输入框中输入的文字也可以使用text属性获取。

    //给UITextField设置初始文字
    field.text = @"初始文字";
    //获取UITextField中的文字
    NSString *string = field.text;
    //打印
    NSLog(@"%@", string);

2、textColor、font、textAlignment属性
这3个属性都是和text属性相关的属性,分别是设置输入框中文字颜色,字体大小,文字对齐方式。

    //设置文字颜色,字体大小,对齐方式
    field.textColor = [UIColor blueColor];
    field.font = [UIFont systemFontOfSize:16];
    field.textAlignment = NSTextAlignmentCenter;

上面的3条代码,设置了文字颜色为蓝色,字体大小为系统字体16,居中对齐。对齐方式和UILabel中的textAlignment属性一样。
3、borderStyle属性
borderStyle是边框属性,设置UITextField的边框,默认为黑色实线边框。

    @property(nonatomic)        UITextBorderStyle       borderStyle;          // default is UITextBorderStyleNone. If set to UITextBorderStyleRoundedRect, custom background images are ignored.

    //这里是属性值的typedef。
    typedef NS_ENUM(NSInteger, UITextBorderStyle) {
        UITextBorderStyleNone,
        UITextBorderStyleLine,
        UITextBorderStyleBezel,
        UITextBorderStyleRoundedRect
    };

4、placeholder属性
placeholder 占位符属性,简单一点说就是设置一段文字,当输入的时候这段文字就会消失。
比如我们在登录一个app的时候会要求我们输入账号密码,这个时候在账号的输入框中就会有“账号”、“请输入账号”之类的提示语。这个就是使用了placeholder属性进行设置。
需要注意的是要使用placeholder属性就必须要让text为nil,必然输入框中就会显示text属性赋值的文字。

    //placeholder属性设置
    field.placeholder = @"请输入";

5、editing属性

    @property(nonatomic,readonly,getter=isEditing) BOOL editing;

在UITextField的头文件中可以看到,editing属性是一个bool值的属性,表示UITextField是否在编辑状态,可以使用这个属性进行快速定位输入。

6、keyboardType属性
这个属性不是UIText的直接属性,这个属性的作用是用来设置输入框在编辑状态时键盘样式。下面是键盘样式的typedef。

    typedef NS_ENUM(NSInteger, UIKeyboardType) {
    UIKeyboardTypeDefault,                
    UIKeyboardTypeASCIICapable,          
    UIKeyboardTypeNumbersAndPunctuation,  
    UIKeyboardTypeURL,                    
    UIKeyboardTypeNumberPad,              
    UIKeyboardTypePhonePad,               
    UIKeyboardTypeNamePhonePad,           
    UIKeyboardTypeEmailAddress,           
    UIKeyboardTypeDecimalPad NS_ENUM_AVAILABLE_IOS(4_1),   
    UIKeyboardTypeTwitter NS_ENUM_AVAILABLE_IOS(5_0),      
    UIKeyboardTypeWebSearch NS_ENUM_AVAILABLE_IOS(7_0),    
    UIKeyboardTypeASCIICapableNumberPad NS_ENUM_AVAILABLE_IOS(10_0), 

    UIKeyboardTypeAlphabet = UIKeyboardTypeASCIICapable, 

};

UITextField代理

在UITextField的头文件中有一个delegate。在开发中UITextField的代理是经常用到的,下面来说一下代理的使用。
要使用UITextField的代理需要在使用代理的地方先准守协议。

    //准守协议
    @interface ViewController ()<UITextFieldDelegate>

就像上面这句代码一样,在文件的interface后面准守协议。下一步就是设置代理。

    //设置代理
    field.delegate = self;

一般是设置代理为self,也就是设置本类为代理。
最后就是实现代理方法了。
UITextField的常用代理方法如下:

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField;        // return NO to disallow editing.
- (void)textFieldDidBeginEditing:(UITextField *)textField;           // became first responder
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField;          // return YES to allow editing to stop and to resign first responder status. NO to disallow the editing session to end
- (void)textFieldDidEndEditing:(UITextField *)textField;             // may be called if forced even if shouldEndEditing returns NO (e.g. view removed from window) or endEditing:YES called
- (void)textFieldDidEndEditing:(UITextField *)textField reason:(UITextFieldDidEndEditingReason)reason NS_AVAILABLE_IOS(10_0); // if implemented, called in place of textFieldDidEndEditing:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;   // return NO to not change text

- (BOOL)textFieldShouldClear:(UITextField *)textField;               // called when clear button pressed. return NO to ignore (no notifications)
- (BOOL)textFieldShouldReturn:(UITextField *)textField;              // called when 'return' key pressed. return NO to ignore.

上面的代理方法系统会分别在不同的时候调用,在代理方法中,我们可以根据实际的项目开发需要进行相应的代码逻辑编写。根据代理方法在不同时机的调用情况完成开发任务。

总结

因为UITextField涉及到用户交互,这个时候就会有很多复杂的情况,在实际的开发中就需要充分结合开发的其他机制进行灵活运用,比如给UITextField加一个监听,实时监听输入文字的变化以做好逻辑处理,再比如在一个滚动列表中有大量的UITextField,如何进行定位,还有在视图滚动时如何处理cell重用导致的UITextField中文字错位问题。