zoukankan      html  css  js  c++  java
  • iOS开发 键盘添加工具条(toolbar)

    原文地址  http://gaohaijun.blog.163.com/blog/static/17669827120119233349519/

    IOS 开发中,iphone/ipad/itouch采用的触摸设计,本身没有硬件键盘,一般都是点击输入框之后,弹出一个虚拟键盘出来,因此开发中,经常在完 成编辑输入之后,要写程序代码来关闭软键盘的输出,非常繁琐,当然关闭软键盘的方式有很多。本文要分享的是一个键盘顶部工具条的类,通过这个工具条,可以 很方便的关闭键盘,而且有上一项,下一项的输入框切换,非常方便,效果如下图所示:

    一、KeyBoardTopBar类文件

      1)KeyBoardTopBar.h头文件

      

     1 #import <Foundation/Foundation.h>
     2 
     3 
     4 @interface KeyBoardTopBar : NSObject {
     5 
     6 UIToolbar       *view;                       //工具条        
     7 
     8 NSArray         *textFields;                 //输入框数组
     9 
    10 BOOL            allowShowPreAndNext;         //是否显示上一项、下一项
    11 
    12 BOOL            isInNavigationController;    //是否在导航视图中
    13 
    14 UIBarButtonItem *prevButtonItem;             //上一项按钮
    15 
    16 UIBarButtonItem *nextButtonItem;             //下一项按钮
    17 
    18 UIBarButtonItem *hiddenButtonItem;           //隐藏按钮
    19 
    20 UIBarButtonItem *spaceButtonItem;            //空白按钮
    21 
    22 UITextField     *currentTextField;           //当前输入框
    23 
    24 }
    25 
    26 @property(nonatomic,retain) UIToolbar *view;
    27 
    28 
    29 -(id)init; 
    30 
    31 -(void)setAllowShowPreAndNext:(BOOL)isShow;
    32 
    33 -(void)setIsInNavigationController:(BOOL)isbool;
    34 
    35 -(void)setTextFieldsArray:(NSArray *)array;
    36 
    37 -(void)showPrevious;
    38 
    39 -(void)showNext;
    40 
    41 -(void)showBar:(UITextField *)textField;
    42 
    43 -(void)HiddenKeyBoard;
    44 
    45 @end

      2)KeyBoardTopBar.m实现文件

      1 #import "KeyBoardTopBar.h"
      2 
      3 
      4 @implementation KeyBoardTopBar
      5 
      6 @synthesize view;
      7 
      8 
      9 //初始化控件和变量
     10 
     11 -(id)init{
     12 
     13 if((self = [super init])) {
     14 
     15 prevButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"上一项" style:UIBarButtonItemStyleBordered target:self action:@selector(ShowPrevious)];
     16 
     17 nextButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"下一项" style:UIBarButtonItemStyleBordered target:self action:@selector(ShowNext)];
     18 
     19 hiddenButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"隐藏键盘" style:UIBarButtonItemStyleBordered target:self action:@selector(HiddenKeyBoard)];
     20 
     21 spaceButtonItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem: UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
     22 
     23 view = [[UIToolbar alloc] initWithFrame:CGRectMake(0,480,320,44)];
     24 
     25 view.barStyle = UIBarStyleBlackTranslucent;
     26 
     27 view.items = [NSArray arrayWithObjects:prevButtonItem,nextButtonItem,spaceButtonItem,hiddenButtonItem,nil];
     28 
     29 allowShowPreAndNext = YES;
     30 
     31 textFields = nil;
     32 
     33 isInNavigationController = YES;
     34 
     35 currentTextField = nil;
     36 
     37 }
     38 
     39 return self;
     40 
     41 }
     42 
     43 //设置是否在导航视图中
     44 
     45 -(void)setIsInNavigationController:(BOOL)isbool{
     46 
     47 isInNavigationController = isbool;
     48 
     49 }
     50 
     51 //显示上一项
     52 
     53 -(void)showPrevious{
     54 
     55 if (textFields==nil) {
     56 
     57 return;
     58 
     59 }
     60 
     61 NSInteger num = -1;
     62 
     63 for (NSInteger i=0; i<[textFields count]; i++) {
     64 
     65 if ([textFields objectAtIndex:i]==currentTextField) {
     66 
     67 num = i;
     68 
     69 break;
     70 
     71 }
     72 
     73 }
     74 
     75 if (num>0){
     76 
     77 [[textFields objectAtIndex:num] resignFirstResponder];
     78 
     79 [[textFields objectAtIndex:num-1 ] becomeFirstResponder];
     80 
     81 [self showBar:[textFields objectAtIndex:num-1]];
     82 
     83 }
     84 
     85 }
     86 
     87 //显示下一项
     88 
     89 -(void)showNext{
     90 
     91 if (textFields==nil) {
     92 
     93 return;
     94 
     95 }
     96 
     97 NSInteger num = -1;
     98 
     99 for (NSInteger i=0; i<[textFields count]; i++) {
    100 
    101 if ([textFields objectAtIndex:i]==currentTextField) {
    102 
    103 num = i;
    104 
    105 break;
    106 
    107 }
    108 
    109 }
    110 
    111 if (num<[textFields count]-1){
    112 
    113 [[textFields objectAtIndex:num] resignFirstResponder];
    114 
    115 [[textFields objectAtIndex:num+1] becomeFirstResponder];
    116 
    117 [self showBar:[textFields objectAtIndex:num+1]];
    118 
    119 }
    120 
    121 }
    122 
    123 //显示工具条
    124 
    125 -(void)showBar:(UITextField *)textField{
    126 
    127 currentTextField = textField;
    128 
    129 if (allowShowPreAndNext) {
    130 
    131 [view setItems:[NSArray arrayWithObjects:prevButtonItem,nextButtonItem,spaceButtonItem,hiddenButtonItem,nil]];
    132 
    133 }
    134 
    135 else {
    136 
    137 [view setItems:[NSArray arrayWithObjects:spaceButtonItem,hiddenButtonItem,nil]];
    138 
    139 }
    140 
    141 if (textFields==nil) {
    142 
    143 prevButtonItem.enabled = NO;
    144 
    145 nextButtonItem.enabled = NO;
    146 
    147 }
    148 
    149 else {
    150 
    151 NSInteger num = -1;
    152 
    153 for (NSInteger i=0; i<[textFields count]; i++) {
    154 
    155 if ([textFields objectAtIndex:i]==currentTextField) {
    156 
    157 num = i;
    158 
    159 break;
    160 
    161 }
    162 
    163 }
    164 
    165 if (num>0) {
    166 
    167 prevButtonItem.enabled = YES;
    168 
    169 }
    170 
    171 else {
    172 
    173 prevButtonItem.enabled = NO;
    174 
    175 }
    176 
    177 if (num<[textFields count]-1) {
    178 
    179 nextButtonItem.enabled = YES;
    180 
    181 }
    182 
    183 else {
    184 
    185 nextButtonItem.enabled = NO;
    186 
    187 }
    188 
    189 }
    190 
    191 [UIView beginAnimations:nil context:nil];
    192 
    193 [UIView setAnimationDuration:0.3];
    194 
    195 if (isInNavigationController) {
    196 
    197 view.frame = CGRectMake(0, 201-40, 320, 44);
    198 
    199 }
    200 
    201 else {
    202 
    203 view.frame = CGRectMake(0, 201, 320, 44);
    204 
    205 }
    206 
    207 [UIView commitAnimations];
    208 
    209 }
    210 
    211 //设置输入框数组
    212 
    213 -(void)setTextFieldsArray:(NSArray *)array{
    214 
    215 textFields = array;
    216 
    217 }
    218 
    219 //设置是否显示上一项和下一项按钮
    220 
    221 -(void)setAllowShowPreAndNext:(BOOL)isShow{
    222 
    223 allowShowPreAndNext = isShow;
    224 
    225 }
    226 
    227 //隐藏键盘和工具条
    228 
    229 -(void)HiddenKeyBoard{
    230 
    231 if (currentTextField!=nil) {
    232 
    233 [currentTextField  resignFirstResponder];
    234 
    235 }
    236 
    237 [UIView beginAnimations:nil context:nil];
    238 
    239 [UIView setAnimationDuration:0.3];
    240 
    241 view.frame = CGRectMake(0, 480, 320, 44);
    242 
    243 [UIView commitAnimations];
    244 
    245 }
    246 
    247 - (void)dealloc {
    248 
    249 [view release];
    250 
    251 [textFields release];
    252 
    253 [prevButtonItem release];
    254 
    255 [nextButtonItem release];
    256 
    257 [hiddenButtonItem release];
    258 
    259 [currentTextField release];
    260 
    261 [spaceButtonItem release];
    262 
    263     [super dealloc];
    264 
    265 }
    266 
    267 @end

    二、如何使用

       1)在用到输入的controller类.h头文件中,首先引入导入KeyBoardTopBar

    #import "KeyBoardTopBar.h"

     

    NSMutableArray *editFieldArray;     //存放视图中可编辑的控件

    KeyBoardTopBar *keyboardbar;

     

       2)在用到输入的controller类.m实现文件中,首先初始化KeyBoardTopBar类的实例,如下:

     

            keyboardbar = [[KeyBoardTopBar alloc]init];

    [keyboardbar  setAllowShowPreAndNext:YES];

    [keyboardbar setIsInNavigationController:NO];

    [keyboardbar setTextFieldsArray:editFieldArray];

    [self.view addSubview:keyboardbar.view];

      3)在用到输入的controller类.m实现文件中,在此以UITextField为例说明,在它的回调方法中,实现如下:

     

    - (void)textFieldDidBeginEditing:(UITextField *)textField{

    [keyboardbar showBar:textField];//KeyBoardTopBar的实例对象调用显示键盘方法

    }

     

    三、总结

      上述的基本原理就是在键盘的上方,加一个透明状的工具条;当然不需要专门定义类,也可以的,可以直接在

    需要调用键盘的地方加入工具条,让你的工具条随着键盘的出现而出现,消失而消失!

     

      大道至简,有更好的方法,希望一起讨论交流,谢谢!

     

     

     

  • 相关阅读:
    Files 的值“
    unable to open databse file
    你选择的点它并不一定在线上!
    各图元对应的DXF名
    combobox下拉列表进行模糊查找时,容易导致光标隐藏
    autocad2010在进行加密时总是出问题
    AutoCAD2010中没有RibbonFoldPanel,需要用RibbonRowPanel替代
    cad2009中把我在2016中定义的块打开为匿名块
    VS2015 未加载程序集时不允许进行更改
    无法将类型为“System.Windows.Forms.SplitContainer”的对象强制转换为类型“System.ComponentModel.ISupportInitialize”
  • 原文地址:https://www.cnblogs.com/VincentXue/p/2658965.html
Copyright © 2011-2022 走看看