2010-08-09 63 views
3

我有一个文本字段在UITableViewCell中显示,我希望能够隐藏键盘时,用户触摸屏幕上除了文本字段以外的任何地方。我知道[field resignFirstResponder],但我不知道如何拦截UITableView背景上的触摸以调用“resignFirstResponder”。如何让键盘消失?

任何帮助将不胜感激。

回答

3

要做到这一点的唯一方法是继承UITableView,在子类UITableView中实现touchesBegan方法并将UITextField对象发送给UITableView。下面是它看起来应该像 -

// GRTableView.h 
// StackOverflow Example 
// 
// Created by Raphael Caixeta on 8/13/10. 
// Copyright 2010 Raphael Caixeta. All rights reserved. 
// 

#import <UIKit/UIKit.h> 


@interface GRTableView : UITableView <UITableViewDelegate> { 

    UITextField *textField; 

} 

@property(nonatomic, retain) UITextField *textField; 

@end 

// 
// GRTableView.m 
// StackOverflow Example 
// 
// Created by Raphael Caixeta on 8/13/10. 
// Copyright 2010 Raphael Caixeta. All rights reserved. 
// 

#import "GRTableView.h" 

@implementation GRTableView 
@synthesize textField; 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    [textField resignFirstResponder]; 
    [super touchesBegan:touches withEvent:event];  
} 

- (void)dealloc { 
    [super dealloc]; 
} 


@end 

,然后在常规文件在那里你会分配一个UITableView,仅分配子类的观点和你的文本字段传递给子类。希望有所帮助。

+0

这不是“唯一的做法”。请参阅列表中的其他有效答案。 – 2010-08-20 12:29:32

+0

亲自尝试一下。你会看到点击UITableView的“背景”将被阻止。如果其他例子有效,你是否真的认为我会创建一个例子? – 2010-08-20 15:13:13

0

尝试执行UITextFieldDelegate- (void)textFieldDidEndEditing:(UITextField *)textField方法。

0

这很简单:创建一个透明的UIView对象,它接收所需区域的触摸,当触摸位于该视图的边界内时,调用resignFirstResponder。

// somewhere in a view controller 
UIView *backgroundView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)]; 
[self.view addSubview:backgroundView]; 

// in the touchesBegan:withEvent: method, for example 
UITouch *touch = [[event allTouches] anyObject]; 

if ([field isFirstResponder] && [touch view] == backgroundView) { 
    [field resignFirstResponder]; 
} 

或者,你可以跳过backgroundView的东西,只需添加一个条件语句,就像你的touchesBegan如下:withEvent:方法方法:

UITouch *touch = [[event allTouches] anyObject]; 

if ([field isFirstResponder] && [touch view] != field) { 
    [field resignFirstResponder]; 
} 

如果触摸! (不)在field的范围内,那么你想要删除键盘。

+0

出于某种原因,我的touchesBegan方法没有被调用。有什么建议?我的视图和UITableView具有userInteractionEnabled和multipleTouchEnabled为YES。 – 2010-08-09 15:28:20

+0

确保touchesBegan:withEvent:方法具有正确的签名,并且在UIViewController中实现,而不是在视图本身中实现。 – 2010-08-09 15:36:42

0

您可以隐藏键盘在下列情况下,

    • (无效)的tableView:(UITableView的*)的tableView didSelectRowAtIndexPath方法:(NSIndexPath *)indexPath {}
    • (void)TextField:(UITextField *)TxtFld textDidChange:(NSString *)searchText {}

在这两种情况下,您应该放置[TxtFld resignFirstResponder];而且当你的文本框工作结束时,你正在对该事件执行一些操作,你也应该写[TxtFld resignFirstResponder];其中TxtFld是UIText字段的对象。

通过使用这个东西,键盘将被解雇。您正在编写的触摸方法可能无法在UITableviewCell上工作。所以这将是隐藏关键板的方式。

它仍然不起作用,然后指定确切的问题发生。

0

有一种比标准的“子类UITableView”或“添加UIView的子类和处理触摸”更简单的方法。我在我想处理触摸的区域上创建一个具有清晰背景色的UIButton。当我将它添加到视图中时,我将其隐藏属性设置为YES。

当文本字段开始编辑时,我将按钮的隐藏属性设置为NO。

然后该按钮只是响应UITouchUpInside控件事件,在调用[textField resignFirstResponder]和button.hidden = YES的方法中。