0

昨日ここでこの質問をしました

TextFieldsを備えたiPhoneTableView-次、前のボタンの問題

これは、次の前のボタンで発生した問題に関するものでした。ありがたいことに、私はそれを分類しました。今私が抱えている問題は、データがテキストフィールドにどのように保存されているかです。この問題を自分ですばやく再現し、新しいプロジェクトを作成して、テーブルビューを含むビューコントローラを作成できます。次に、ラベルとテキストフィールドを含むカスタムテーブルビューセルを作成し、このテーブルにたとえば10個のセルを作成します。

したがって、最初のテキストフィールドにランダムなテキストを入力してから、テーブルの一番下までスクロールすると、メモリに読み込まれるテキストフィールドの1つが、最初のテキストフィールドと同じテキストで表示されます。 、そして本当に速く上下にスクロールすると、テキストはテキストフィールド間をジャンプし続け、入力した最初のテキストフィールドのテキストが消えて、代わりに2番目または3番目のセルに表示されることがあります。

例最初のテキストフィールドにtest1を入力すると、次のように表示されます。

ここに画像の説明を入力してください

次に下にスクロールすると、セル8のテキストフィールドにも何らかの理由でまったく同じテキストが表示されます

ここに画像の説明を入力してください

回避策として、昨日表示されたカスタムテーブルビューセルクラスにこのコードを追加してみました。sDataという文字列オブジェクトを追加し、ユーザーがそのテキストフィールドの編集を終了すると、テキストがそのオブジェクトに保存されます。

  #pragma mark - UITextFieldDelegate

    - (void)textFieldDidEndEditing:(UITextField *)textField {
        self.sData = inputOne.text;

        if (self.didEndEditingAction) {
            self.didEndEditingAction();
        }

このメソッドもカスタムテーブルビューのセルクラスに追加しました

    - (void)reloadData {

        if(self.sData != nil)
        {
                self.inputOne.text = self.sData;
        }

そして、cellForRowAtIndexPathメソッドでこれを呼び出しますが、同じ問題が発生します。

これにより、いくつかの問題が発生します。主に、テキストフィールドを含むセルが画面に表示されていないかのようにデータを保存しようとすると、メモリに読み込まれず、テキストフィールドのデータを保存できません。そしてもちろん、他の問題は、フィールド内のテキストが何らかの理由で別のセルに消えて再表示され続けることです。

なぜこれが起こっているのか、そしてこれに対する良い回避策があるかどうか誰かが知っていますか?

前もって感謝します!

編集:

うまくいかないと思ったのですが、配列を作成し、textFieldDidEndEditingデリゲートメソッドの下でこれを実行しました。

BOOL bAdd = YES;
    for(int i = 0; i < [tableArray count]; i++)
    {
        UITextField *field = [tableArray objectAtIndex:i];

        if(field.tag == textField.tag)
        {
            bAdd = NO;
            break;
        }
    }

    if(bAdd)
    {
        NSLog(@"Adding %i", textField.tag);
        [tableArray addObject:textField];
    }

次に、cellForRowAtIndexPathメソッドの下に、これを追加しました

for(int i = 0; i < [tableArray count]; i++)
            {
                UITextField *field = [tableArray objectAtIndex:i];
                if(field.tag == cell.textField.tag)
                {
                    cell.textField.text = field.text;
                    break;
                }
            }

これは確実に機能すると思いましたが、同じ奇妙な問題が発生していて、理由がわかりません:@

4

2 に答える 2

0

テーブルビューがセルを「再利用」するため、この問題に直面しています。ご存知かもしれませんが、でこのメソッドを使用する– dequeueReusableCellWithIdentifier:– cellForRowAtIndexPath:、セルが再利用されます。

あなたがしたいのは、再利用する直前にそれらのテキストフィールドのテキストをnilにリセットすることです。これを行うには、次の方法を使用できます。

- (void)prepareForReuse
{
    [super prepareForReuse];
     //Set whatever you want to be reset to nil E.g., myTextfield.text = nil;
}

カスタムテーブルビューのセルクラスにそのメソッドを記述すると、問題が解決するはずです。

幸運を。!

于 2013-02-26T09:03:44.043 に答える
0

最後にこれに対する解決策を見つけ、NSMutableDictionary 変数を作成し、テキスト フィールド textFieldDidEndEditing デリゲート メソッドの下に、キーがテキスト フィールド タグであるテキスト フィールドの値を次のように保存しました。

[textFieldDictionary setValue:textField.text forKey:[NSString stringWithFormat:@"%i", textField.tag]];

それから cellForRowAtIndexPath メソッドの下に、これを置きます

if([textFieldDictionary valueForKey:[NSString stringWithFormat:@"%i", cell.textField.tag]])
            {
                cell.textField.text = [textFieldDictionary valueForKey:[NSString stringWithFormat:@"%i", cell.textField.tag]];
            }

今では完璧に動作します!!

于 2013-02-27T08:28:26.247 に答える