iOS之键盘处理

本文介绍了如何在iOS应用中处理键盘,通过创建自定义的UIToolbar,实现不同输入框间键盘的Next和Done按钮功能。详细步骤包括设置UITextField的ReturnKey,使用代理方法,以及创建GDGKeyBoardTool类和xib文件来实现键盘工具条的交互效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

做开发时很多时候都要对键盘进行处理,看三张效果图,怎么把键盘做成酱紫


当光标在姓名输入框时,键盘右下键变为“下一项”,工具条可以点击“下一项”和“完成”

这里写图片描述

当光标在邮箱输入框时,键盘右下键变为“下一项”,工具条可以点击“上一项”、“下一项”和“完成”

这里写图片描述

当光标在地址输入框时,键盘右下键变为“完成”,工具条可以点击“上一项”和“完成”

这里写图片描述


下面来看怎么做

  • 首先创建一个工程
  • 在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);
}

Demo下载 : GitHub地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值