我有一个UITableView,我为每个单元格分配了一个UITextField。我希望能够接受来自每个文本字段的输入,并在用户点击屏幕上除键盘之外的任何位置时关闭键盘。这是我到目前为止的代码,但是当我在表格的最后一个单元格中时,我发现键盘只会被解雇。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [self.gradesTableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
self.tf = [[UITextField alloc] initWithFrame:CGRectMake(225, (cell.contentView.bounds.size.height-30)/2, 50, 30)];
[self.tf setDelegate: self];
self.tf.tag = indexPath.row;
self.tf.textAlignment = NSTextAlignmentCenter;
self.tf.placeholder = @"0";
self.tf.backgroundColor = [UIColor grayColor];
self.tf.borderStyle = UITextBorderStyleRoundedRect;
self.tf.keyboardType = UIKeyboardTypeDecimalPad;
[cell addSubview:self.tf];
cell.textLabel.text = [self.adderArrayLabels objectAtIndex:indexPath.section];
return cell;
}
- (void)textFieldDidBeginEditing:(UITextField *)textField{
self.tapGR = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap)];
[self.view addGestureRecognizer:self.tapGR];
NSLog(@"Started editing");
}
我已经尝试了endEditing:
和resignFirstResponder
,但是当我在最后一个单元格的文本字段中时,它们都只会关闭键盘。
- (void)tap {
[self.tf endEditing:YES];
//[self.tf resignFirstResponder];
NSLog(@"tap called");
self.tapGR.enabled = NO;
}
使用代码中的NSLog语句,我可以确认每次识别出适当的敲击手势但仍然键盘停留时调用方法tap
。我该如何解决这个问题?
答案 0 :(得分:1)
问题在于:
self.tf
您的类具有文本字段属性,每次创建新文本字段时,都会将其分配给此属性。然后,您只在此属性上尝试endEditing:
或resignFirstResponder
,该属性始终是最近创建的单元格上的文本字段。
您根本不需要此属性,只能在创建单元格时使用本地文本字段变量。
然后将点击方法更改为:
- (void)tap {
[self.view endEditing:YES];
NSLog(@"tap called");
self.tapGR.enabled = NO;
}
确实,该方法应该是:- (void)tap:(id)sender;
另外,正如我评论的那样,手势识别器应该添加到viewDidLoad
中。我们只需要添加一次,而不是每次文本字段开始编辑时。每次文本字段开始编辑时添加它的唯一原因是,如果你每次文本字段结束编辑时也删除它...但是由于手势调用的方法只是摆脱了键盘,我认为没有理由这样做。