UITextField在tableviewcell上显示键盘

时间:2016-04-09 21:22:15

标签: ios objective-c uitableview uitextfield

我有一个简单的自定义表格视图单元格,它有一个标签和一个文本字段。在故事板中看起来像这样:

enter image description here

我想在用户点击单元格中的任意位置时显示键盘,包括他们点击标签的时间。我99%确定实现此目的的方法是在单击单元格时调用becomeFirstResponder。

这是我的简单ViewController:

#import "ViewController.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UITableView *tableView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.tableView.dataSource = self;
    self.tableView.delegate = self;

    [self.tableView setEstimatedRowHeight:44.0f];
    [self.tableView setRowHeight:UITableViewAutomaticDimension];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 1;
}

- (NSInteger) numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"custom"];
    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
    BOOL firstResponder = [cell becomeFirstResponder];

}

我的自定义表格视图单元格:

#import "CustomTableViewCell.h"

@implementation CustomTableViewCell

- (void)awakeFromNib {
    [super awakeFromNib];
    // Initialization code
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state
}

- (BOOL) canBecomeFirstResponder {
    return YES;
}

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

@end

我验证了调用了firstFirstResponder,但是返回false。我错过了什么?

2 个答案:

答案 0 :(得分:1)

认为@ alex-i在评论http://fm939.wnyc.org/wnycfm中指出:

  

当短暂删除文本字段时,也会发生此[文本字段不成为第一响应者]   视图/窗口层次结构,同时成为第一响应者(例如,   重新加载保存它的UITableView或UICollectionView   文本框)。

选择时会发生这种情况。

您可以使用以下操作向表格视图添加UITapGestureRecognizer,而不是使用didSelectRowAtIndexPath:

- (IBAction)tap:(UITapGestureRecognizer *)sender
{
    CGPoint location = [sender locationInView:self.tableView];
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:location];
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
    BOOL firstResponder = [cell becomeFirstResponder];
}

它将成为第一响应者。

答案 1 :(得分:0)

如果有人需要快速替代方案:您可以将外部UIViews与插座集合连接起来。在每个UIViewController类上,您曾在下面调用过。因此,当触摸外框时,将使用键盘激活editfield。您也可以将其应用于标签。 (通过禁用标签的用户交互)

@IBOutlet var outerBoxes:[UIView]!

override func viewDidLoad() {
    super.viewDidLoad();
    for outerBox in outerBoxes { outerBox.respondForEditBox() };
...

但是一旦你必须有这个代码:

extension UIView {
    func respondForEditBox() {
        let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(UIView.focusOnEditBox));
        self.addGestureRecognizer(tap);
    }

    func focusOnEditBox() {
        for sview in self.subviews {
            if sview is UITextField {
                sview.becomeFirstResponder();
            }
        }
    }
}

受到@ Esqarrouth回答的启发 Close iOS Keyboard by touching anywhere using Swift