0

ユーザーがテーブルビュー内のすべてのテキストフィールド(セルごとに2つのテキストフィールド)を矢印キーで循環できるようにしようとしています。

現在私が行っているのは、各テキストフィールドにタグを設定し、各テキストフィールドを配列に追加することです。ユーザーがテキストフィールドをクリックして編集を開始すると、いくつかの矢印ボタンが表示され、矢印キーを押すと、現在選択されているテキストフィールドのタグを取得し、それを配列の場所として使用して、テキストフィールドを引き出します。に移動して、新しいテキストフィールドをファーストレスポンダーとして設定します。

ただし、これに伴う問題は、私のセルが再利用されるという事実にあります。したがって、ユーザーがセルを画面外にスクロールすると、戻ってきたときに、テーブルの行1のセルに、タグ15と16のテキストフィールドが含まれている可能性があります。これらは、矢印キーを壊すテキストフィールド配列の最後です。そして、スクロールすればするほど、テキストフィールドの順序が乱れます。

再利用可能なセルを維持しながら、私がやろうとしていることを達成することは可能ですか?それとも、単にそれらを再利用しないことを要求するだけですか?

これが私の矢印コードです...

- (void)arrowPressedHandler:(UIButton *)button
{
UITextField *newTextFieldSelection;

//tags are offset by 2 because I have use tag 1 for something else, and tag 0 cannot be used
int realLocation = selectedTextField.tag - 2; 

//arrow code.  for an up button i go back 2 slots in the array, right is + 1 in array
//etc etc 
@try{
    switch (button.tag) {
        case NumericKeyboardViewUpArrow:
            newTextFieldSelection = [textFields objectAtIndex:realLocation - 2];
            [newTextFieldSelection becomeFirstResponder];
            break;
        case NumericKeyboardViewLeftArrow:
            newTextFieldSelection = [textFields objectAtIndex:realLocation - 1];
            [newTextFieldSelection becomeFirstResponder];
            break;
        case NumericKeyboardViewRightArrow:
            newTextFieldSelection = [textFields objectAtIndex:realLocation +1];
            [newTextFieldSelection becomeFirstResponder];
            break;
        case NumericKeyboardViewDownArrow:
            newTextFieldSelection = [textFields objectAtIndex:realLocation + 2];
            [newTextFieldSelection becomeFirstResponder];
            break;
        default:
            break;
    }
}
@catch (NSException *e)
{
    return;
}
}
4

1 に答える 1

0

私は少し異なるアプローチを取ります。

textFieldのさまざまなタグをすべて与えるのではなく、各行内で一意であるが、行間で同じタグを付けます。つまり、左側のタグはタグ1000を取得し、右側のタグは1001を取得します。次に、セルのindexPathを使用して、適切な行を取得します。メソッドarrowPressedHandler:は次のようになります(擬似コード):

- (void)arrowPressedHandler:(UIButton *)button
{
    NSIndexPath *selectedIndexPath = indexPathOfSelectedTextfield;
    UITextField *newTextFieldSelection;
    NSIndexPath *newIndexPath;
    NSUInteger newTag = 0;

    @try{
        switch (button.tag) {
            case NumericKeyboardViewUpArrow:
                // Move back two textFields (which would be the one directly above this one)
                newIndexPath = selectedIndexPath - 1;
                newTag = selectedTextField.tag;
                break;
            case NumericKeyboardViewLeftArrow:
                // Move back one textField.
                if (selectedTextField.tag == 1000) {
                    // Selected text field is on left.  Select right textfield in the row above
                    newIndexPath = selectedIndexPath - 1;
                    newTag = 1001;
                } else {
                    // Selected text field is on right.  Select the left textfield in the same row
                    newIndexPath = selectedIndexPath;
                    newTag = 1000;
                }
                break;
            // etc.
        }
        [self.tableview scrollToRowAtIndexPath:newIndexPath];
        newTextFieldSelection = [[self.tableview cellForRowAtIndexPath:newIndexPath] viewWithTag:newTag];
        [newTextFieldSelection becomeFirstResponder];

    }
    @catch (NSException *e)
    {
        return;
    }

}
于 2013-02-22T15:42:46.433 に答える