0

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:

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 に答える