![](/img/trans.png)
[英]UITableView inside UITableViewCell not receiving touch events
[英]How to handle events (Touch Up Inside/Outside) for UItableViewCell with a text field?
我有一个自定义UITableViewCell,其中有一个文本字段。 我已经使用IB创建了它,并且有一个自定义类。
现在,我的问题是我想设置文本字段,以便在输入文本期间,如果用户在文本字段之外单击(而不点击键盘上的回车/完成键),则该字段会辞退第一响应者。 我了解,我需要处理Touch Up Inside事件。 但是,即使我已完成连接,我的tableview类也从未收到此事件。 我假设它是因为它不是UIcontrol的子类,因为它必须是UITableViewCel,所以我不能做到这一点。
那么解决方案是什么? 我如何接收这些事件?
头文件:
#import <UIKit/UIKit.h>
@interface MMSingleTextFieldCell : UITableViewCell <UITextFieldDelegate>
// Properties
@property (weak, nonatomic) IBOutlet UITextField *singleTextField;
// Methods
- (IBAction)eventTouchUpOutside:(id)sender;
- (IBAction)eventTouchUpInside:(id)sender;
@end
类文件:
#import "MMSingleTextFieldCell.h"
@implementation MMSingleTextFieldCell
@synthesize singleTextField;
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
// Initialization code
}
return self;
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
[super setSelected:selected animated:animated];
// Configure the view for the selected state
}
- (IBAction)eventTouchUpOutside:(id)sender {
[singleTextField resignFirstResponder];
}
- (IBAction)eventTouchUpInside:(id)sender {
[singleTextField resignFirstResponder];
}
我最近刚刚在Github上开源了一个项目,该项目应该使这一切相对容易实现。 它包括一个可以轻松插入单元格的类和一个演示其功能的示例项目。
如果查看RootTableViewController的viewDidLoadMethod
您将看到我正在添加一个手势识别器:
self.tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self
action:@selector(dismissKeyboard)];
_tapGestureRecognizer.delegate = self;
_tapGestureRecognizer.cancelsTouchesInView = NO;
[self.tableView addGestureRecognizer:_tapGestureRecognizer];
添加关闭键盘方法:
- (void)dismissKeyboard {
[_textField resignFirstResponder];
}
添加一个手势识别器回调(在RootTableViewController中):
//see: http://stackoverflow.com/questions/7195661/why-is-uigesturerecognizer-being-called-on-my-textfield-clear-button
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
if([touch.view isKindOfClass:[UITextField class]] ||
[touch.view isKindOfClass:[UIButton class]])
{
return NO;
}
return YES;
}
当然,这意味着您必须使RootTableViewController遵守UIGestureRecognizerDelegate协议(在头文件中):
@interface RootTableViewController : UITableViewController<SATextFieldDelegate, UIGestureRecognizerDelegate>
如果希望用户滚动表视图并关闭键盘,请执行以下表视图委托回调:
- (void)scrollViewWillBeginDragging:(UIScrollView *)activeScrollView {
if (_textField.isFirstResponder) {
[self dismissKeyboard];
}
}
我相信这是您想要的功能。
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
if (_textField.isFirstResponder) {
[self dismissKeyboard];
}
}
尝试这个:
1)实现UIGestureRecognizerDelegate协议
2)以viewDidLoad为例,创建以下内容
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
initWithTarget:self
action:@selector(hideKeyboard:)];
tap.delegate = self;
[self.view addGestureRecognizer:tap];
3)现在,从1开始从协议实施方法
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
// Use this for allow some control to receive his natural tap event. You can use tap.cancelsTouchesInView = NO; in the 2 step instead of this, try both of then and choose on your own.
if (touch.view == <some control>) {
//NSLog(@"NO");
return NO;
}
//NSLog(@"YES");
return YES;
}
4)最后,实现tap的回调
-(void) hideKeyboard:(id)sender{
if (<your edit text>.isEditing) {
[<your edit text> resignFirstResponder];
}
}
我希望这会有所帮助,或者至少会为您指明正确的方向
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.