0

我有一个自定义的 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];

}
4

3 回答 3

1

我最近刚刚在 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];
    }
}
于 2013-05-07T21:47:55.640 回答
0

我相信这是您想要的功能。

 -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
      if (_textField.isFirstResponder) {
         [self dismissKeyboard];
      }
  }
于 2013-05-07T21:49:30.517 回答
0

试试这个:

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];
    }
}

我希望这会有所帮助,或者至少为您指明正确的方向

于 2013-05-07T21:54:22.423 回答