iphone開(kāi)發(fā)中給鍵盤加個(gè)隱藏工具條

字號(hào):


    因?yàn)閕phone手機(jī)采用的觸摸涉及,本身沒(méi)有硬件鍵盤,一般都是點(diǎn)擊輸入框之后,彈出一個(gè)虛擬鍵盤出來(lái),因此在iphone開(kāi)發(fā)中,經(jīng)常在完成編輯輸入之后,要寫程序代碼來(lái)關(guān)閉軟鍵盤的輸出,非常繁瑣,當(dāng)然關(guān)閉軟鍵盤的方式有很多,比如放一個(gè)按鈕在底層,通過(guò)點(diǎn)擊屏幕的空白處來(lái)關(guān)閉鍵盤;也可以處理return鍵盤事件來(lái)關(guān)閉鍵盤,這些暫且不說(shuō),本文要分享的是一個(gè)鍵盤頂部工具條的類,通過(guò)這個(gè)工具條,可以很方便的關(guān)閉鍵盤,而且有上一項(xiàng),下一項(xiàng)的輸入框切換,非常方便,效果請(qǐng)看下圖:
    名單
    類文件如下:
    keyboardtopbar.h
    //
    // keyboardtopbar.h
    //
    //
    // created by walkman on 10-12-2.
    // copyright 2010 手機(jī)主題 all rights reserved.
    //
    #import
    @interface keyboardtopbar : nsobject {
    uitoolbar *view;//工具條
    nsarray *textfields;//輸入框數(shù)組
    bool allowshowpreandnext;//是否顯示上一項(xiàng)下一項(xiàng)
    bool isinnavigationcontroller;//是否在導(dǎo)航視圖中
    uibarbuttonitem *prevbuttonitem;//上一項(xiàng)按鈕
    uibarbuttonitem *nextbuttonitem;//下一項(xiàng)按鈕
    uibarbuttonitem *hiddenbuttonitem;//隱藏按鈕
    uibarbuttonitem *spacebuttonitem;//空白按鈕
    uitextfield *currenttextfield;//當(dāng)前輸入框
    }
    @property(nonatomic,retain) uitoolbar *view;
    -(id)init; //初始化
    -(void)setallowshowpreandnext:(bool)isshow; //設(shè)置是否顯示上一項(xiàng)下一項(xiàng)
    -(void)setisinnavigationcontroller:(bool)isbool; //設(shè)置是否在導(dǎo)航視圖中
    -(void)settextfieldsarray:(nsarray *)array; //設(shè)置輸入框數(shù)組
    -(void)showprevious; //顯示上一項(xiàng)
    -(void)shownext; //顯示下一項(xiàng)
    -(void)showbar:(uitextfield *)textfield; //顯示工具條
    -(void)hiddenkeyboard; //隱藏鍵盤
    @end
    keyboardtopbar.m 文件
    //
    // keyboardtopbar.m
    //
    // created by walkman on 10-12-2.
    // copyright 2010 手機(jī)主題下載 all rights reserved.
    //
    #import keyboardtopbar.h
    @implementation keyboardtopbar
    @synthesize view;
    //初始化控件和變量
    -(id)init{
    if(self = [super init]) {
    prevbuttonitem = [[uibarbuttonitem alloc] initwithtitle:@上一項(xiàng) style:uibarbuttonitemstylebordered target:self action:@selector(showprevious)];
    nextbuttonitem = [[uibarbuttonitem alloc] initwithtitle:@下一項(xiàng) 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;
    }
    //設(shè)置是否在導(dǎo)航視圖中
    -(void)setisinnavigationcontroller:(bool)isbool{
    isinnavigationcontroller = isbool;
    }
    //顯示上一項(xiàng)
    -(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]];
    }
    }
    //顯示下一項(xiàng)
    -(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è)置輸入框數(shù)組
    -(void)settextfieldsarray:(nsarray *)array{
    textfields = array;
    }
    //設(shè)置是否顯示上一項(xiàng)和下一項(xiàng)按鈕
    -(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
    下面是使用這個(gè)類的代碼:
    在uiviewcontroller頭文件中申明,并定義,并且實(shí)現(xiàn)uitextfielddelegate代理
    比如:在keyboardtopbarviewcontroller.h文件,我是這樣寫的
    //
    // keyboardtopbarviewcontroller.h
    // keyboardtopbar
    //
    // created by walkman on 10-12-2.
    // copyright 2010 手機(jī)主題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ù)組,在上面已經(jīng)初始化,并添加了n個(gè)uitextfield在里面。
    //具體的代碼請(qǐng)下載附件查看,這里只貼出了相關(guān)的代碼
    keyboardbar = [[keyboardtopbar alloc]init];
    [keyboardbar setallowshowpreandnext:yes];
    [keyboardbar setisinnavigationcontroller:no];
    [keyboardbar settextfieldsarray:editfieldarray];
    [self.view addsubview:keyboardbar.view];
    }
    //這個(gè)方法是uitextfielddelegate代理中的方法,表示輸入框開(kāi)始處于編輯狀態(tài)。
    - (void)textfielddidbeginediting:(uitextfield *)textfield{
    [keyboardbar showbar:textfield]; //顯示工具條
    ......
    }
    ok了,調(diào)用起來(lái)還是很方便吧,當(dāng)然,這個(gè)類還有需要完善的地方,比如,在執(zhí)行了hiddenkeyboard方法隱藏了鍵盤和工具條之后,如果在調(diào)用頁(yè)面時(shí)候需要再做進(jìn)一步處理,目前是無(wú)法實(shí)現(xiàn)的,等下一個(gè)版本中再加入一個(gè)delegate類。