2

我有一个 UITableView,它有 2 个不同的 customcell 定义。一个是单个 UITextField,另一个是 4 个 UITextField

userInteractionEnabled 手动设置为启用单元格级触摸导航,并且我在 didSelectRowAtIndexPath 中处理 UI 交互到相关单元格的第一响应者

当我只使用一个自定义单元格 (EditableCustomCell) 和一个 UITextField (editableTextField) 时,这一切都很好,但现在我有一个自定义单元格 (LatLonCustomCell) 和 4 个 UITextFields(度、分、秒、笛卡尔),我无法确定哪个字段有被触摸以设置 becomeFirstResponder

(目前我在调试期间默认使用第一个名为 degree 的文本字段)

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{      
  [prevField resignFirstResponder];
  prevField.userInteractionEnabled = NO;

  if(indexPath.section == kFirstSection && (indexPath.row == kLatitudeRow || indexPath.row == kLongitudeRow)) {
    LatLonCustomCell *customCell = (LatLonCustomCell *)[MyTableView cellForRowAtIndexPath:indexPath];
    currField = customCell.degrees; // need to set correct field here
  } else {
    EditableCustomCell *customCell = (EditableCustomCell *)[MyTableView cellForRowAtIndexPath:indexPath];
    currField = customCell.editableTextField;
  }

  currFieldIndexPath = [NSIndexPath indexPathForRow:indexPath.row inSection:indexPath.section];
  currField.userInteractionEnabled = YES;
  [currField becomeFirstResponder];

}

4

3 回答 3

1

好的,所以对于那些遇到相同或相似问题的人,我终于取得了突破

我决定在调用 didSelectRowAtIndexPath 之前需要捕获触摸的 X/Y 坐标。这样我就可以通过检查触摸文本字段的“边界”来确定触摸发生在哪个 UITextField

经过一些随机搜索,我发现在视图控制器中捕获任何触摸事件的非常简单的方法(因为 touchesBegan 只发生在自定义覆盖的 UITableViewCell 类中,我不知道如何将它传递回链 Cell > TableView > Scroll View >控制器)

通过将其添加到 viewDidLoad 方法:

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapGesture:)];
tapGesture.numberOfTapsRequired = 1;
// Pass the tap through to the UITableView
tapGesture.cancelsTouchesInView = NO;
[self.view addGestureRecognizer:tapGesture];

这会捕获所有的触摸,调用handleTapGesture方法

然后在这个方法中,它只是检查触摸是否在 tableview 的边界内的情况,如果是,确定触摸点的 indexPath,然后检查所需对象的边界,下面是一个简化版本我想出什么

-(void)handleTapGesture:(UITapGestureRecognizer *)tapGesture {

  CGPoint tapLoc = [tapGesture locationInView:self.tableView];

  if([MyTableView indexPathForRowAtPoint:tapLoc]) {
    // Tap still handled by the UITableView delegate method

    NSIndexPath *indexPath = [MyTableView indexPathForRowAtPoint:tapLoc];

    if(indexPath.section == 0 && (indexPath.row == kLatitudeRow || indexPath.row == kLongitudeRow)) {
      LatLonCustomCell *customCell = (LatLonCustomCell *)[MyTableView cellForRowAtIndexPath:indexPath];
      UIScrollView *scrollView = (UIScrollView *)self.view;
      CGRect rc;

      // Degrees
      rc = [customCell.degrees convertRect:[customCell.degrees bounds] toView:scrollView];

      if (tapLoc.x >= rc.origin.x && tapLoc.y >= rc.origin.y && tapLoc.x <= (rc.origin.x + rc.size.width) && tapLoc.y <= (rc.origin.y + rc.size.height)) {
        NSLog(@"touch within bounds for DEGREES");
        touchField = customCell.degrees;
      }

// Repeat for other textfields here ....

....

在我的代码中,我将字段保存在 touchField 中,就像在 didSelectRowAtIndexPath 代码中一样,我已经在处理 prevField/currField 值以控制启用/禁用userInteractionEnabled并将 currField 设置为becomeFirstReponder

希望这对某人有帮助:)

于 2012-09-16T12:42:10.987 回答
0

过去,当我需要检查文本框是否被触摸时,我检查了 YourTextField.text.length 是否 > 0。如果是,您可以设置 becomeFirstResponder。希望这可以帮助。

于 2012-09-14T17:00:08.530 回答
0

你有没有想过使用 NSNotificationCenter 来请求 UITextFieldTextDidBeginEditingNotification 的通知?

在 viewDidLoad

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldBeganEditing) 
                                             name:UITextFieldTextDidBeginEditingNotification object:nil];

然后像

-(void) textFieldBegainEditing: (NSNotification*) notification {
  // [notification object] will be the UITextField
  // do what you need to do with it (resign, become first responder)
}
于 2012-09-16T03:22:11.143 回答