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的實例對象調用顯示鍵盤方法

 

}

 

 

 

三、總結

 

  上述的基本原理就是在鍵盤的上方,加一個透明狀的工具條;當然不需要專門定義類,也可以的,可以直接在

 

需要調用鍵盤的地方加入工具條,讓你的工具條隨着鍵盤的出現而出現,消失而消失!

 

 

 

  大道至簡,有更好的方法,希望一起討論交流,謝謝!

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM