0

セクションをUITableViewタップすると、セクションが展開され、選択できるオプションが表示されるか、いずれかの を介して独自のオプションを挿入できUITextFieldますUITableViewCells。そのセルにはtableView: cellForRowAtIndexPath:、カスタム セルを構成してファーストレスポンダーを設定するためのコードが含まれています。

        DataAddTVCell *dataInputcell = (DataAddTVCell *)cell;
        dataInputcell.data.delegate = self;
        self.dataTextfield = dataInputcell.data;
        [self.dataTextfield becomeFirstResponder];

データ フィールドはUITextField. UITextField後でできるように、self.dataTextFieldに保存しresignFirstResponderます。

myDataAddTVCellが最初に読み込まれて展開されたセクションでは、正常に動作し、ファーストレスポンダーになります。ファーストレスポンダーとしての辞任も機能します。ただし、別のセクションが展開されたときにセルが再度読み込まれると、ファーストレスポンダーにはなりません。をタップするtextFieldと、キーボードが正常に表示され、以前と同じ方法でファーストレスポンダを辞任できます。textField が最初のレスポンダーに一度しかなれない理由がわかりません。これらのデリゲート メソッドもあり、< UITextFieldDelegate>を設定しました

- (BOOL)canBecomeFirstResponder
{
    return YES;
}

- (BOOL)becomeFirstResponder
{
    return YES;
}

を使用しているため、これが起こっているのではないかと疑っていdequeueReusableCellWithIdentifierます。これを使用しながら動作させる方法はありますか?または、表示されたときに常にファーストレスポンダーにしたい場合は、毎回新しいセルを作成する必要がありますか? ただし、常に非常に多くのセルを作成するのはかなり悪いようです。

4

1 に答える 1

0

これは、セルがロードされるたびにセルが再作成され、サブビューが再作成されるために発生します。その結果、テキストフィールドへの参照が失われます。正常に再署名するには、セルの再作成を避けるために、親セルにフォーカスを維持する必要があります。

編集

もう 1 つの方法は、最初の応答者になりたいテキストフィールドであるセルのインデックスパスを覚えておくことです。そのインデックスパスでセルを作成するときは、そのサブビューを反復処理し、テキストフィールドの参照をキャッチして呼び出しますbecomeFirstResponder

上記と同じことを行う必要があります。cellForRowAtIndexPath:適切な場所に次のコードを記述します。

 if(indexPath.section == 0)//your section in which that cell is present. e.g. 0
            {
                if(indexPath.row == 1)//cell no. 1
                {
                    if(showingInputCell)//flag to keep track either it is textfield cell or other
                    {
                        for (UIView * subview in cell.subviews) {
                            if([subview isKindOfClass:[UITextField class]])
                                [(UITextField *)subview becomeFirstResponder];
                        }
                    }
                }
            }
于 2013-06-10T07:31:27.717 に答える