【问题标题】:Dismiss keyboard for UITextfield in UITableView cell关闭 UITableView 单元格中 UITextfield 的键盘
【发布时间】:2014-06-28 01:49:31
【问题描述】:

我有一个 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。我该如何解决这个问题?

【问题讨论】:

  • 您应该在viewDidLoad 中添加手势识别器。您只需要添加一次——而不是每次文本视图开始编辑时。
  • 不确定我是否得到这个问题,但是在创建点击手势识别器时,点击方法被称为选择器,当您开始在文本字段中输入时会调用该选择器
  • 对。这意味着如果我尝试编辑 5 个文本字段,手势识别它创建了 5 次,而它只需要创建一次,在 viewDidLoad

标签: ios objective-c uitableview uitextfield


【解决方案1】:

问题出在这里:

self.tf

您的类有一个文本字段属性,每次创建一个新的文本字段时,您都将其分配给该属性。然后,您只在此属性上尝试endEditing:resignFirstResponder,这将始终是最近创建的单元格上的文本字段。

您根本不需要此属性,只需在创建单元格时使用本地文本字段变量即可。

然后将您的点击方法更改为:

- (void)tap {
    [self.view endEditing:YES];

    NSLog(@"tap called");
    self.tapGR.enabled = NO;
}

确实,方法应该是:- (void)tap:(id)sender;

另外,正如我评论的那样,手势识别器应该添加到viewDidLoad。我们只需要添加一次,而不是每次文本字段开始编辑时。每次文本字段开始编辑时添加它的唯一原因是,如果您每次文本字段结束编辑时也要删除它......但是由于手势调用的方法只是摆脱了键盘,我认为没有理由这样做。

【讨论】:

  • 好的,这实际上是有道理的。至于 - (void)tap:(id)sender; 的方法,在创建手势识别器时声明选择器时,这似乎不是一个选项。每次识别到水龙头时我都会删除它,因为我觉得在viewDidLoad 中调用它会使屏幕的其余部分变得无用,因为它只会在寻找水龙头时出现。无论如何都会尝试。
  • @Marcus 像这样:@selector(tap:)
猜你喜欢
  • 1970-01-01
  • 2017-03-28
  • 1970-01-01
  • 1970-01-01
  • 2011-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多