UITextField里面的UITextFell:didSelectRowAtIndexPath中的becomeFirstResponder

时间:2013-04-04 10:43:42

标签: ios objective-c uitableview uitextfield

我目前正试图让这个工作。任何帮助表示赞赏。

我有一个内置UITableViewCell的自定义UITextField。当我选择表格单元格时,我想让UITextField第一个响应者 但是[textField becomeFirstResponder];会返回 false

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
  UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
  UITextField *textField;
  for (UIView *view in [cell subviews]) {
    if ([view isMemberOfClass:[UITextField class]]) {
      textField = ((UITextField *)view);
    }
  }

  [textField becomeFirstResponder];
}

根据要求,文本字段的初始化。这是在UITableViewCell子类中完成的:

- (id) initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
  self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];

  if (self) {
    // Init Textfield
    _textField = [[UITextField alloc] init];
    _textField.backgroundColor = [UIColor clearColor];
    _textField.delegate = self;
    [self addSubview:_textField];
  }

return self;
}

8 个答案:

答案 0 :(得分:14)

如果您有自定义单元格,那么您可以执行以下操作:

@implementation CustomCell

#pragma mark - UIResponder

- (BOOL)canBecomeFirstResponder
{
    return YES;
}

- (BOOL)becomeFirstResponder
{
    return [self.textField becomeFirstResponder];
}

@end

然后在表视图中委托:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    if ([cell canBecomeFirstResponder]) {
        [cell becomeFirstResponder];
    }
}

答案 1 :(得分:3)

为每个tag提供UITextField,并使用以下代码:

UITableViewCell* cell = (UITableViewCell*)sender.superview.superview;
UITextField *txtField = (UITextField*)[cell viewWithTag:tag];
[txtField becomeFirstResponder];

didSelectRowAtIndexPath方法中。

它的工作非常好.. :)

答案 2 :(得分:2)

我相信你需要设置textField的{​​{1}}财产。

在致电delegate

之前,将textField.delegate = self;添加到您的方法中

答案 3 :(得分:2)

我认为您在创建单元格时应在文本字段中包含标记值:

- (id) initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
      self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];

      if (self) {
        // Init Textfield
        _textField = [[UITextField alloc] init];
        _textField.backgroundColor = [UIColor clearColor];
        _textField.delegate = self;
        _textField.tag = 999;
        [self addSubview:_textField];
      }

    return self;
}

在didSelectRowAtIndexPath方法上使用标记值来恢复对象:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
  UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
  UITextField *textField = (UITextField*)[cell viewWithTag:999];


  if (![textField isFirstResponder]){
     [textField becomeFirstResponder];
  }

}

我已经包含了一个验证来控制文本字段是否已经是第一个响应者。

希望它按预期工作

答案 4 :(得分:0)

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
  UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
  UITextField *textField;
  for (id subV in [cell subviews]) {
    if ([subV isKindOfClass:[UITextField class]]) {
      textField = (UITextField *)subV;
      [textField becomeFirstResponder];
      break;
    }
  }


}

我认为这会对你有所帮助。

答案 5 :(得分:0)

更新了@ josh-fuggle的答案以使用Swift 2.2。

import Foundation
import UIKit

class CustomTableCell:UITableViewCell {

    @IBOutlet var textValue: UITextField!

    override func canBecomeFirstResponder() -> Bool {
        return true
    }

    override func becomeFirstResponder() -> Bool {
        return self.textValue.becomeFirstResponder()
    }
}

这是在你的表视图委托:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

        let cell = tableView.cellForRowAtIndexPath(indexPath)
        if ((cell?.canBecomeFirstResponder()) != nil) {
            cell?.becomeFirstResponder()
        }
}

答案 6 :(得分:0)

您可以执行以下操作:

class CustomCell: UITableViewCell {
    @IBOutlet weak var textField: UITextField!

    override func awakeFromNib() {
        super.awakeFromNib()
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(contentViewTapped))
        self.contentView.addGestureRecognizer(tapGesture)
    }
    @objc func contentViewTapped() {
        _ = self.textField.becomeFirstResponder()
    }
}

答案 7 :(得分:-2)

[self.titleLab performSelector:@selector(becomeFirstResponder)withObject:nil afterDelay:0.2];