0

我有一个自定义分组的 TableView,它有 5 个部分,总共有 50 个类型的自定义单元格:

Label      |    XXX

其中 XXX 可以是 UITextField、UITextView、UIButton、UILabel。单元格在 tableView 中具有混合顺序。

在此处输入图像描述

为了浏览 textFields 和 textViews,我在键盘上添加了 Next/Prev 按钮。

在此处输入图像描述

问题是当我选择 txtField 并单击 Next 或 Prev 按钮时,表格滚动到所需的单元格位置,但txtField 没有得到光标。为了获得带有 textField/textView 的单元格,我使用:

 nextCell = [self tableView:_myTableView 
      cellForRowAtIndexPath:[NSIndexPath indexPathForRow:curRow inSection:curSec]];

我需要搜索 tableView 中的所有单元格,而不仅仅是通过可见的单元格。

正如我测试的那样,问题出在这行代码中,因为如果我调用:

nextCell = [_myTableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:curRow inSection:curSec]];

并且单元格可见,然后 txtField 获得光标。但是,如果我需要从单元格(部分 = 1,行 = 6)跳转到不可见的单元格(部分 = 0,行 = 3),我会得到零。

我的按钮功能的完整代码:

-(void) previousTextField:(id)sender
{
   int curTagInd = _editingTextElement.tag;

   NSIndexPath *curInd = [self getRowIndexOf:_editingTextElement];
   int curSec = curInd.section;
   int curRow = curInd.row;

   id nextView = nil;
   UITableViewCell *nextCell = nil;

   do {        
    curRow--;

    if (curRow >=0) {
        nextCell = [self tableView:_myTableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:curRow inSection:curSec]];//[_myTableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:--curRow inSection:curInd.section]];
        curTagInd--;
        if ([nextCell isKindOfClass:[CustomCell class]] || [nextCell isKindOfClass:[CustomLongTextCell class]]) {
            do {
                nextView = [nextCell viewWithTag:curTagInd];
                if ([nextView isEnabled]) {
                    nextCell = nil;
                    _editingIndexPath = [NSIndexPath indexPathForRow:curRow inSection:curSec];
                    break;
                }else{
                    break;
                }
            } while (nextView != nil && ((![nextView isKindOfClass:[UITextField class]] && ![nextView isKindOfClass:[UITextView class]])  || ![nextView isEnabled]));
        }
      }
      else if(curSec > 0){ //got to previous section
        curSec--;
        curRow = [self getNumberOfRowsInSection:curSec];
        curTagInd = [self getNumberOfRowsInSection:curSec]+1;
      }
      else{
        nextCell = nil;
      }

   } while (nextCell != nil);

   if (nextView != nil) {
      [self.myTableView scrollToRowAtIndexPath:_editingIndexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES];

      UITextField *textField = (UITextField *)nextView;
      [textField becomeFirstResponder];
   }
}

使用此代码我进入方法textFieldShouldBeginEditing:,但不是textFieldDidBeginEditing:

4

1 回答 1

0

解决方案:

问题是表格仅在函数previousTextField:完成后才开始滚动,因此[textField becomeFirstResponder];在表格滚动到所需位置之前被调用。由于所需的单元格在屏幕上仍然不可见,因此没有调用委托方法。

为了避免这种情况,我在表格滚动行之后添加了计时器:

NSTimer *t = [NSTimer scheduledTimerWithTimeInterval: 0.2
                                              target: self
                                            selector:@selector(doneScrolling)
                                            userInfo: nil repeats:NO];

并定义doneScrolling为:

-(void)doneScrolling
{
    NSLog(@"done scrolling");
    [self tableView:self.myTableView didSelectRowAtIndexPath:self.editingIndexPath];
}

在哪里:

-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:NO]; 
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
    UIView *nextView = [cell viewWithTag:indexPath.row+1];
    if ([nextView isKindOfClass:[UITextView class]] || [nextView isKindOfClass:[UITextField class]]) {
        if ([nextView isEnabled]) {
            UITextField *textField = (UITextField *)nextView;
            [textField becomeFirstResponder];
        }
    }  
 }
于 2012-07-27T14:34:06.303 回答