【问题标题】:UITextField show keyboard on tableviewcell clickUITextField 在 tableviewcell 单击时显示键盘
【发布时间】:2016-04-09 21:22:15
【问题描述】:

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

我想在用户单击单元格中的任意位置(包括单击标签时)显示键盘。我 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

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

【问题讨论】:

    标签: ios objective-c uitableview uitextfield


    【解决方案1】:

    像@alex-i 在评论here 中指出的那样思考:

    当文本字段从 成为第一响应者时的视图/窗口层次结构(例如 重新加载包含它的 UITableView 或 UICollectionView 文本字段)。

    选择时会发生什么。

    您可以将 UITapGestureRecognizer 添加到 tableView 中,而不是使用 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];
    }
    

    它将成为第一响应者。

    【讨论】:

      【解决方案2】:

      如果有人需要一个快速的替代方案:您可以将外部 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-03-02
        • 2021-10-21
        • 2014-03-16
        • 1970-01-01
        • 1970-01-01
        • 2013-04-20
        • 1970-01-01
        相关资源
        最近更新 更多