因為iphone手機采用的觸摸涉及,本身沒有硬件鍵盤,一般都是點擊輸入框之后,彈出一個虛擬鍵盤出來,因此在iphone開發(fā)中,經常在完成編輯輸入之后,要寫程序代碼來關閉軟鍵盤的輸出,非常繁瑣,當然關閉軟鍵盤的方式有很多,比如放一個按鈕在底層,通過點擊屏幕的空白處來關閉鍵盤;也可以處理return鍵盤事件來關閉鍵盤,這些暫且不說,本文要分享的是一個鍵盤頂部工具條的類,通過這個工具條,可以很方便的關閉鍵盤,而且有上一項,下一項的輸入框切換,非常方便,效果請看下圖:
名單
類文件如下:
keyboardtopbar.h
//
// keyboardtopbar.h
//
//
// created by walkman on 10-12-2.
// copyright 2010 手機主題 all rights reserved.
//
#import
@interface keyboardtopbar : nsobject {
uitoolbar *view;//工具條
nsarray *textfields;//輸入框數(shù)組
bool allowshowpreandnext;//是否顯示上一項下一項
bool isinnavigationcontroller;//是否在導航視圖中
uibarbuttonitem *prevbuttonitem;//上一項按鈕
uibarbuttonitem *nextbuttonitem;//下一項按鈕
uibarbuttonitem *hiddenbuttonitem;//隱藏按鈕
uibarbuttonitem *spacebuttonitem;//空白按鈕
uitextfield *currenttextfield;//當前輸入框
}
@property(nonatomic,retain) uitoolbar *view;
-(id)init; //初始化
-(void)setallowshowpreandnext:(bool)isshow; //設置是否顯示上一項下一項
-(void)setisinnavigationcontroller:(bool)isbool; //設置是否在導航視圖中
-(void)settextfieldsarray:(nsarray *)array; //設置輸入框數(shù)組
-(void)showprevious; //顯示上一項
-(void)shownext; //顯示下一項
-(void)showbar:(uitextfield *)textfield; //顯示工具條
-(void)hiddenkeyboard; //隱藏鍵盤
@end
keyboardtopbar.m 文件
//
// keyboardtopbar.m
//
// created by walkman on 10-12-2.
// copyright 2010 手機主題下載all rights reserved.
//
#import keyboardtopbar.h
@implementation keyboardtopbar
@synthesize view;
//初始化控件和變量
-(id)init{
if(self = [super init]) {
prevbuttonitem = [[uibarbuttonitem alloc] initwithtitle:@上一項 style:uibarbuttonitemstylebordered target:self action:@selector(showprevious)];
nextbuttonitem = [[uibarbuttonitem alloc] initwithtitle:@下一項 style:uibarbuttonitemstylebordered target:self action:@selector(shownext)];
hiddenbuttonitem = [[uibarbuttonitem alloc] initwithtitle:@隱藏鍵盤 style:uibarbuttonitemstylebordered target:self action:@selector(hiddenkeyboard)];
spacebuttonitem = [[uibarbuttonitem alloc]initwithbarbuttonsystemitem: uibarbuttonsystemitemflexiblespace target:nil action:nil];
view = [[uitoolbar alloc] initwithframe:cgrectmake(0,480,320,44)];
view.barstyle = uibarstyleblacktranslucent;
view.items = [nsarray arraywithobjects:prevbuttonitem,nextbuttonitem,spacebuttonitem,hiddenbuttonitem,nil];
allowshowpreandnext = yes;
textfields = nil;
isinnavigationcontroller = yes;
currenttextfield = nil;
}
return self;
}
//設置是否在導航視圖中
-(void)setisinnavigationcontroller:(bool)isbool{
isinnavigationcontroller = isbool;
}
//顯示上一項
-(void)showprevious{
if (textfields==nil) {
return;
}
nsinteger num = -1;
for (nsinteger i=0; i<[textfields count]; i++) {
if ([textfields objectatindex:i]==currenttextfield) {
num = i;
break;
}
}
if (num>0){
[[textfields objectatindex:num] resignfirstresponder];
[[textfields objectatindex:num-1 ] becomefirstresponder];
[self showbar:[textfields objectatindex:num-1]];
}
}
//顯示下一項
-(void)shownext{
if (textfields==nil) {
return;
}
nsinteger num = -1;
for (nsinteger i=0; i<[textfields count]; i++) {
if ([textfields objectatindex:i]==currenttextfield) {
num = i;
break;
}
}
if (num<[textfields count]-1){
[[textfields objectatindex:num] resignfirstresponder];
[[textfields objectatindex:num+1] becomefirstresponder];
[self showbar:[textfields objectatindex:num+1]];
}
}
//顯示工具條
-(void)showbar:(uitextfield *)textfield{
currenttextfield = textfield;
if (allowshowpreandnext) {
[view setitems:[nsarray arraywithobjects:prevbuttonitem,nextbuttonitem,spacebuttonitem,hiddenbuttonitem,nil]];
}
else {
[view setitems:[nsarray arraywithobjects:spacebuttonitem,hiddenbuttonitem,nil]];
}
if (textfields==nil) {
prevbuttonitem.enabled = no;
nextbuttonitem.enabled = no;
}
else {
nsinteger num = -1;
for (nsinteger i=0; i<[textfields count]; i++) {
if ([textfields objectatindex:i]==currenttextfield) {
num = i;
break;
}
}
if (num>0) {
prevbuttonitem.enabled = yes;
}
else {
prevbuttonitem.enabled = no;
}
if (num<[textfields count]-1) {
nextbuttonitem.enabled = yes;
}
else {
nextbuttonitem.enabled = no;
}
}
[uiview beginanimations:nil context:nil];
[uiview setanimationduration:0.3];
if (isinnavigationcontroller) {
view.frame = cgrectmake(0, 201-40, 320, 44);
}
else {
view.frame = cgrectmake(0, 201, 320, 44);
}
[uiview commitanimations];
}
//設置輸入框數(shù)組
-(void)settextfieldsarray:(nsarray *)array{
textfields = array;
}
//設置是否顯示上一項和下一項按鈕
-(void)setallowshowpreandnext:(bool)isshow{
allowshowpreandnext = isshow;
}
//隱藏鍵盤和工具條
-(void)hiddenkeyboard{
if (currenttextfield!=nil) {
[currenttextfield resignfirstresponder];
}
[uiview beginanimations:nil context:nil];
[uiview setanimationduration:0.3];
view.frame = cgrectmake(0, 480, 320, 44);
[uiview commitanimations];
}
//釋放
- (void)dealloc {
[view release];
[textfields release];
[prevbuttonitem release];
[nextbuttonitem release];
[hiddenbuttonitem release];
[currenttextfield release];
[spacebuttonitem release];
[super dealloc];
}
@end
下面是使用這個類的代碼:
在uiviewcontroller頭文件中申明,并定義,并且實現(xiàn)uitextfielddelegate代理
比如:在keyboardtopbarviewcontroller.h文件,我是這樣寫的
//
// keyboardtopbarviewcontroller.h
// keyboardtopbar
//
// created by walkman on 10-12-2.
// copyright 2010 手機主題 all rights reserved.
//
#import
@class keyboardtopbar;
@interface keyboardtopbarviewcontroller : uiviewcontroller {
uitableview *tableview;
nsmutablearray *cellstextarray;
nsmutablearray *editfieldarray;
uibutton *btnreg;
keyboardtopbar *keyboardbar;
cgrect rect;
}
在在uiviewcontroller的m文件中,初始化,并添加到view中
- (void)viewdidload {
[super viewdidload];
......
//其中editfieldarray 是uitextfield數(shù)組,在上面已經初始化,并添加了n個uitextfield在里面。
//具體的代碼請下載附件查看,這里只貼出了相關的代碼
keyboardbar = [[keyboardtopbar alloc]init];
[keyboardbar setallowshowpreandnext:yes];
[keyboardbar setisinnavigationcontroller:no];
[keyboardbar settextfieldsarray:editfieldarray];
[self.view addsubview:keyboardbar.view];
}
//這個方法是uitextfielddelegate代理中的方法,表示輸入框開始處于編輯狀態(tài)。
- (void)textfielddidbeginediting:(uitextfield *)textfield{
[keyboardbar showbar:textfield]; //顯示工具條
......
}
ok了,調用起來還是很方便吧,當然,這個類還有需要完善的地方,比如,在執(zhí)行了hiddenkeyboard方法隱藏了鍵盤和工具條之后,如果在調用頁面時候需要再做進一步處理,目前是無法實現(xiàn)的,等下一個版本中再加入一個delegate類。
更多信息請查看IT技術專欄