5つのセクションと合計50のタイプのカスタムセルを持つカスタムグループ化されたTableViewがあります。
Label | XXX
ここで、XXXはUITextField、UITextView、UIButton、UILabelです。tableViewではセルの順序が混在しています。
textFieldsとtextViewsをナビゲートするために、キーボードに[次へ]/[前へ]ボタンを追加しました。
問題は、txtFieldを選択して[次へ]または[前へ]ボタンをクリックすると、テーブルが必要なセル位置までスクロールしますが、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)にジャンプする必要がある場合は、nilになります。
ボタン機能の私の完全なコード:
-(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: