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的实例对象调用显示键盘方法

 

}

 

 

 

三、总结

 

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

 

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

 

 

 

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

 

 

 

posted @ 2012-08-27 17:46  疯狂的萝卜  阅读(12186)  评论(0编辑  收藏  举报