做开发时很多时候都要对键盘进行处理,看三张效果图,怎么把键盘做成酱紫
当光标在姓名输入框时,键盘右下键变为“下一项”,工具条可以点击“下一项”和“完成”
当光标在邮箱输入框时,键盘右下键变为“下一项”,工具条可以点击“上一项”、“下一项”和“完成”
当光标在地址输入框时,键盘右下键变为“完成”,工具条可以点击“上一项”和“完成”
下面来看怎么做
- 首先创建一个工程
- 在Main.storyBoard里面拖入三个Label和三个textField
- 在选中姓名输入框之后,点选右侧的ReturnKey选择Next项
- 以此类推,在选中邮箱输入框之后,点选右侧的ReturnKey选择Next项
在选中地址输入框之后,点选右侧的ReturnKey选择Done项
分别选中三个输入框,按住control键通过拖线方式让ViewController成为三个输入框的代理
然后添加一个UIToolBar的类”GDGKeyBoardTool”和一个与类同名的xib,注意xib要和类”GDGKeyBoardTool”绑定,xib文件里添加一个toolBar和三个item,一个弹簧
GDGKeyBoardTool.h (文件中的两个item属性是xib拖线过来的)
#import <UIKit/UIKit.h>
//三个item的枚举
typedef enum {
GDGKeyboardToolItemPrevious,
GDGKeyboardToolItemNext,
GDGKeyboardToolItemDone
} GDGKeyboardToolItem;
//生成代理方法
@class GDGKeyBoardTool;
@protocol GDGKeyboardToolDelegate <NSObject>
@optional
- (void)keyboardTool:(GDGKeyBoardTool *)tool didClickItem:(GDGKeyboardToolItem)item;
@end
@interface GDGKeyBoardTool : UIToolbar
@property (weak, nonatomic) IBOutlet UIBarButtonItem *nextItem;
@property (weak, nonatomic) IBOutlet UIBarButtonItem *previousItem;
+ (instancetype)tool;
/** 代理 */
@property (nonatomic, weak) id<GDGKeyboardToolDelegate> toolbarDelegate;
@end
GDGKeyBoardTool.m(文件中的三个item方法是xib拖线过来的)
#import "GDGKeyBoardTool.h"
@implementation GDGKeyBoardTool
+ (instancetype)tool
{
return [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self) owner:nil options:nil] firstObject];
}
- (IBAction)previous:(id)sender {
if ([self.toolbarDelegate respondsToSelector:@selector(keyboardTool:didClickItem:)]) {
[self.toolbarDelegate keyboardTool:self didClickItem:GDGKeyboardToolItemPrevious];
}
}
- (IBAction)next:(id)sender {
if ([self.toolbarDelegate respondsToSelector:@selector(keyboardTool:didClickItem:)]) {
[self.toolbarDelegate keyboardTool:self didClickItem:GDGKeyboardToolItemNext];
}
}
- (IBAction)done:(id)sender {
if ([self.toolbarDelegate respondsToSelector:@selector(keyboardTool:didClickItem:)]) {
[self.toolbarDelegate keyboardTool:self didClickItem:GDGKeyboardToolItemDone];
}
}
@end
ViewController.m (文件中的三个UITextField属性是Main.storyboard拖线过来的)
#import "ViewController.h"
#import "GDGKeyBoardTool.h"
@interface ViewController ()<UITextFieldDelegate,GDGKeyboardToolDelegate>
@property (weak, nonatomic) IBOutlet UITextField *nameField;
@property (weak, nonatomic) IBOutlet UITextField *emailField;
@property (weak, nonatomic) IBOutlet UITextField *addressField;
/** 所有的文本框数组 */
@property (nonatomic, strong) NSArray *fields;
/** 工具条 */
@property (nonatomic, weak) GDGKeyBoardTool *toolbar;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.fields = @[self.nameField, self.emailField, self.addressField];
// 加载工具条控件
GDGKeyBoardTool *toolbar = [GDGKeyBoardTool tool];
toolbar.toolbarDelegate = self;
self.toolbar = toolbar;
//设置工具条
self.nameField.inputAccessoryView = toolbar;
self.emailField.inputAccessoryView = toolbar;
self.addressField.inputAccessoryView = toolbar;
}
//点击空白处让键盘退下
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.view endEditing:YES];
}
#pragma mark - <GDGKeyboardToolDelegate>
//回调代理方法
- (void)keyboardTool:(GDGKeyBoardTool *)tool didClickItem:(GDGKeyboardToolItem)item
{
if (item == GDGKeyboardToolItemPrevious) {
NSUInteger currentIndex = 0;
for (UIView *view in self.view.subviews) {
if ([view isFirstResponder]) {
currentIndex = [self.fields indexOfObject:view];
}
}
currentIndex--;
[self.fields[currentIndex] becomeFirstResponder];
self.toolbar.previousItem.enabled = (currentIndex != 0);
self.toolbar.nextItem.enabled = YES;
} else if (item == GDGKeyboardToolItemNext) {
NSUInteger currentIndex = 0;
for (UIView *view in self.view.subviews) {
if ([view isFirstResponder]) {
currentIndex = [self.fields indexOfObject:view];
}
}
currentIndex++;
[self.fields[currentIndex] becomeFirstResponder];
self.toolbar.previousItem.enabled = YES;
self.toolbar.nextItem.enabled = (currentIndex != self.fields.count - 1);
} else if (item == GDGKeyboardToolItemDone) {
[self.view endEditing:YES];
}
}
#pragma mark - <UITextFieldDelegate>
/**
* 当点击键盘右下角的return key时,就会调用这个方法
*/
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
if (textField == self.nameField) {
// 让emailField成为第一响应者
[self.emailField becomeFirstResponder];
} else if (textField == self.emailField) {
// 让addressField成为第一响应者
[self.addressField becomeFirstResponder];
} else if (textField == self.addressField) {
[self.view endEditing:YES];
}
return YES;
}
/**
* 键盘弹出就会调用这个方法
*/
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
NSUInteger currentIndex = [self.fields indexOfObject:textField];
self.toolbar.previousItem.enabled = (currentIndex != 0);
self.toolbar.nextItem.enabled = (currentIndex != self.fields.count - 1);
}