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类。

时间: 2024-08-03 14:44:06

iPhone开发中给键盘加个隐藏工具条的相关文章

asi重定向问题-iPhone开发中网络请求重定向多次后,重定向方法无效

问题描述 iPhone开发中网络请求重定向多次后,重定向方法无效 在做登陆功能的时候,发送了post请求网址是url,登陆成功后,会返回个新的newurl,在对newurl请求就ok,但是 登陆成功了几次后(正确的用户和密码),在登陆就不能触发请求了,其他的请求也不能触发,这是为什么??不仅仅是登陆这块的重定向请求,其他功能也有重定向请求,只要请求重定向了,累加3次 其他的网络请求就不能被触发,求解!!!急求 解决方案 http://www.hackhome.com/InfoView/Artic

Android开发中如何解决加载大图片时内存溢出的问题

Android开发中如何解决加载大图片时内存溢出的问题    在Android开发过程中,我们经常会遇到加载的图片过大导致内存溢出的问题,其实类似这样的问题已经屡见不鲜了,下面将一些好的解决方案分享给大家.   尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存. 因此,改用先通过Bitmap

Android 开发中fragment预加载问题

我们在做应用开发的时候,一个Activity里面可能会以viewpager(或其他容器)与多个Fragment来组合使用,而如果每个fragment都需要去加载数据,或从本地加载,或从网络加载,那么在这个activity刚创建的时候就变成需要初始化大量资源.这样的结果,我们当然不会满意.那么,能不能做到当切换到这个fragment的时候,它才去初始化呢? 答案就在Fragment里的setUserVisibleHint这个方法里.请看关于Fragment里这个方法的API文档(国内镜像地址:ht

Android开发中Listview动态加载数据的方法示例

本文实例讲述了Android开发中Listview动态加载数据的方法.分享给大家供大家参考,具体如下: 最近在研究网络数据加载的问题,比如我有几百,甚至上千条数据,这些数据如果一次性全部加载到arraylist,然后再加载到Listview中.我们必然会去单独开线程来做,这样造成的结果就是会出现等待时间很长,用户体验非常不好.我的想法是动态加载数据,第一次加载十条,然后往下面滑动的时候再追加十条,再往下面滑动的时候再去追加,这样大大减少了用户等待的时间,同时给处理数据留下了时间.网上看到了这样一

Android开发中超好用的正则表达式工具类RegexUtil完整实例

本文实例讲述了Android开发中超好用的正则表达式工具类RegexUtil.分享给大家供大家参考,具体如下: /*********************************************** * 正则表达式工具 * * @author chen.lin * @version 1.0 ************************************************/ public class RegexUtil { /** * 车牌号码Pattern */ pub

IPad/IPhone 开发中的布局问题

  初步学习IOS(IPad/IPhone)开发,这两天在界面布局上花了很多时间. IOS的界面方法有两种方式: 1 使用Interface Builder创建界面,然后和相应的controller相关联 2 通过code手动的添加UI组件和布局 优缺点: 方法1可以创建界面快捷而简单,也会比较易于维护.缺点就是动态性不够,据说性能上也会差些(由于需要读取XIB文件). 方法2的优点就是比较灵活和可控.缺点正好是方法1的优点的方面. 个人对这两种方式的体会: *使用方法1来划分组件,每个功能都有

iPhone开发中的多语言化

之前写过一篇关于Qt多语言化的文章:http://blog.csdn.net/jasonblog/article/details/5445191. 虽然在进行iOS开发的过程中,可以在Xcode里直接使用中文字符串,但总觉得有点奇怪和不舒服. 加上用户可以在iPhone设置里选择不同的语言环境,因此采取国际化手段是个不错的选择. 最重要的是,工作量不大,尤其是刚开始进行项目时就考虑到了. 这里讨论最基本的文案多语言化. 首先,为项目新增资源文件Strings File,命名为"Localizab

iOS开发中UIWebView的加载本地数据的三种方式_IOS

UIWebView是IOS内置的浏览器,可以浏览网页,打开文档 html/htm pdf docx txt等格式的文件. safari浏览器就是通过UIWebView做的. 服务器将MIME的标识符等放入传送的数据中告诉浏览器使用那种插件读取相关文件. uiwebview加载各种本地文件(通过loadData方法): UIWebView加载内容的三种方式: 1 加载本地数据文件 指定文件的MIMEType 编码格式使用@"UTF-8" 2加载html字符串(可以加载全部或者部分html

iOS开发中更改手机状态栏和隐藏手机状态栏的方法

状态栏:显示网络信号.电量.时间等信息,位于手机界面顶部! 如果手机应用的背景色为黑色,那么黑色的状态栏则会看不到,以下两种方式设置背景栏颜色. // 改变状态栏的文字颜色为白色 - (UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent; } // 改变状态栏的文字颜色为黑色 - (UIStatusBarStyle)preferredStatusBarStyle { return UISta