0

このスレッドでいくつかの解決策を試しましたが、問題が発生しています。私のテーブルにはplistからのデータが動的に読み込まれるため、ストーリーボードで1つのセルから別のセルへの接続を作成できません。セルの右側に2つのDSTextFieldオブジェクトがあるDSCellと呼ばれるカスタムUITableViewCellクラスを実装しました。左端のDSTextFieldでEnterキーを押すと、フォーカスが次のフィールドに正常に移動します。ただし、右側のテキストフィールドでEnterキーを押すと、フォーカスが次のセル(1行下)のテキストフィールドに移動するはずです。しかし、そうではありません。

セルのテキストフィールドには、タグ2と3があります。

これが私のcellForRowAtIndexメソッドです。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

static NSString *CellIdentifier = @"PaperCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

// Configure the cell...
NSString *text = [_paper objectAtIndex:indexPath.row];
UILabel *label = (UILabel *)[cell viewWithTag:1];
label.text = text;


// Set the "nextField" property of the second DSTextfield in the previous cell to the first DSTextField
// in the current cell
if(indexPath.row > 0)
{
    DSCell *lastcell = (DSCell *)[self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:indexPath.row-1 inSection:indexPath.section]];
    DSTextField *lastField = (DSTextField *)[lastcell viewWithTag:3];
    DSTextField *currentField = (DSTextField *)[cell viewWithTag:2];
    lastField.nextField = currentField;
}

return cell;

}

textFieldShouldReturnメソッドは次のとおりです。

- (BOOL) textFieldShouldReturn:(UITextField *) textField {

DSTextField *field = (DSTextField *)textField;

UIResponder *responder = field;
[responder resignFirstResponder];

responder = field.nextField;
[responder becomeFirstResponder];

return YES;

}

現在、cellForRowAtIndexPathが呼び出されたときに、2番目のDSTextFieldのnextFieldプロパティを現在のセルに設定しようとしていますが、機能していないようです。行1から始めて、前の行のセルを取得しようとします。次に、右端のテキストフィールドのnextFieldプロパティを、現在のセルの左端のテキストフィールドに割り当てます。

これを行うためのより良い方法はありますか?テキストフィールドごとに異なるタグを付けたくないので、そうすると面倒になる可能性があります。

4

1 に答える 1

1

メソッド内でフォーカスをシフトする正しいセルのみを見つけようとすることをお勧めしますtextFieldShouldReturn:。問題を引き起こしている可能性のあるものの1つは、セルをlastCell非表示にするように要求している可能性があります。セルはテーブルビューによって破棄されます(したがって、nextFieldは無効です)。

物事が戻ったときに発生するようにロジックを変更する(nextField2つのセルの間に連続して設定する必要があります):

- (BOOL) textFieldShouldReturn:(UITextField *) textField {

//This isn't necessary: UIResponder *responder = field;
//Or this: [responder resignFirstResponder];

//Check if it's the left or right text field
if (textField.tag == 3) {
    //Find the cell for this field (this is a bit brittle :/ )
    UITableViewCell *currentCell = textField.superview.superview;
    NSIndexPath *ip = [self.tableView indexPathForCell:currentCell];
    if (ip.row < [self.tableView numberOfRowsInSection:ip.section] - 1) {
        DSCell *nextCell = (DSCell *)[self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:ip.row+1 inSection:ip.section]];
        [[nextCell viewWithTag:2] becomeFirstResponder];
    }
}

return YES;

}
于 2013-01-25T19:42:46.320 に答える