网站首页  汉语字词  英语词汇  考试资料  写作素材  旧版资料

请输入您要查询的考试资料:

 

标题 iPhone开发中给键盘加个隐藏工具条
内容
    因为iPhone手机采用的触摸涉及,本身没有硬件键盘,一般都是点击输入框之后,弹出一个虚拟键盘出来,因此在iPhone开发中,经常在完成编辑输入之后,要写程序代码来关闭软键盘的输出,非常繁琐,当然关闭软键盘的方式有很多,比如放一个按钮在底层,通过点击屏幕的空白处来关闭键盘;也可以处理Return键盘事件来关闭键盘,这些暂且不说,本文要分享的是一个键盘顶部工具条的类,通过这个工具条,可以很方便的关闭键盘,而且有上一项,下一项的输入框切换,非常方便,效果请看下图:
    名单
    类文件如下:
    KeyBoardTopBar.h
    //
    // KeyBoardTopBar.h
    //
    //
    // Created by walkman on 10-12-2.
    // Copyright 2010 手机主题 http://www.shouji138.com All rights reserved.
    //
    #import
    @interface KeyBoardTopBar : NSObject {
    UIToolbar *view;//工具条
    NSArray *TextFields;//输入框数组
    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; //设置输入框数组
    -(void)ShowPrevious; //显示上一项
    -(void)ShowNext; //显示下一项
    -(void)ShowBar:(UITextField *)textField; //显示工具条
    -(void)HiddenKeyBoard; //隐藏键盘
    @end
    KeyBoardTopBar.m 文件
    //
    // KeyBoardTopBar.m
    //
    // Created by walkman on 10-12-2.
    // Copyright 2010 手机主题下载 http://www.shouji138.com 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];
    }
    //设置输入框数组
    -(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头文件中申明,并定义,并且实现UITextFieldDelegate代理
    比如:在keyboardtopbarViewController.h文件,我是这样写的
    //
    // keyboardtopbarViewController.h
    // keyboardtopbar
    //
    // Created by walkman on 10-12-2.
    // Copyright 2010 手机主题 http://www.shouji138.com 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数组,在上面已经初始化,并添加了N个UITextField在里面。
    //具体的代码请下载附件查看,这里只贴出了相关的代码
    keyboardbar = [[KeyBoardTopBar alloc]init];
    [keyboardbar setAllowShowPreAndNext:YES];
    [keyboardbar setIsInNavigationController:NO];
    [keyboardbar setTextFieldsArray:editFieldArray];
    [self.view addSubview:keyboardbar.view];
    }
    //这个方法是UITextFieldDelegate代理中的方法,表示输入框开始处于编辑状态。
    - (void)textFieldDidBeginEditing:(UITextField *)textField{
    [keyboardbar ShowBar:textField]; //显示工具条
    ......
    }
    OK了,调用起来还是很方便吧,当然,这个类还有需要完善的地方,比如,在执行了HiddenKeyBoard方法隐藏了键盘和工具条之后,如果在调用页面时候需要再做进一步处理,目前是无法实现的,等下一个版本中再加入一个Delegate类。
随便看

 

在线学习网考试资料包含高考、自考、专升本考试、人事考试、公务员考试、大学生村官考试、特岗教师招聘考试、事业单位招聘考试、企业人才招聘、银行招聘、教师招聘、农村信用社招聘、各类资格证书考试等各类考试资料。

 

Copyright © 2002-2024 cuapp.net All Rights Reserved
更新时间:2025/5/13 6:11:42