我有一个自定义分组的 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: