1

私は小さな問題を抱えていますが、これは本当に古典的 (dequeueReusableCellWithIdentifier によって再利用されるとセルが混同される) と思われますが、同様の質問を既に見ていて、答えが見つかりません。

したがって、古典的なコンテキスト:UITableViewストーリーボードにプロトタイプ セルがあり、1 つは画像 (非同期にフェッチされた) で、もう 1 つは UITextView です。

両方で問題が発生したため、テキスト セルに注目してみましょう。ネットワークが原因ではないことがわかります。

上下にスクロールすると、細胞が混ざります。関数内のデータに応じてテキスト値を設定したためだと思いますが、cellForRowAtIndexPathわかりません。

私の例のセルは次のとおりです。

---------------
| 1. "TEXT1"  |
---------------
|             |
| 2. IMAGE2   |
|             |
---------------
| 3. "TEXT3"  |
---------------
| 4. "TEXT4"  |
---------------
|             |
| 5. IMAGE5   |
|             |
---------------

私はずっと下にスクロールします。すべて問題ありません。一番下でバウンスすると、セル 3 と 4 がリロードされます (関数に NSLog を入れましたcellForRowAtIndexPath)。最初にセル 4 がリロードされ、次にセル 3 がリロードされます (ログによると)。問題は、セル 3 と 4 の両方が値として "TEXT3" になることです! つまりNSLog、関数で UITextField.text に値を指定すると、同じテキスト値はありませんが、シミュレーターの画面では.. ?

これが私のコードです:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Getting data for row from indexPath
    Data *data = [self.dataArray objectAtIndex:indexPath.row];
    NSString *cellIdentifier = [NSString stringWithFormat:@""];
    if (data.type == 1) { // Text type
        cellIdentifier = @"TextCell";
    }
    else if (data.type == 2){
        cellIdentifier = @"PhotoCell";
    }

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];
    // Getting various cell elements

    if (data.type == 1) {
        // Text is 1000
        UITextView *textView = (UITextView *)[tableView viewWithTag:1000];
        textView.text = data.text;
    }
    else if (data.type == 2){
        //STUFF FOR PHOTO TYPE OF DATA
    }

    return cell;
}

ところで、iOS6 のシミュレーターではこのエラーが発生するが、iOS7 では発生しないと言うと便利です (ただし、メモリ管理が異なるだけかもしれません..)

助けてくれてどうもありがとう!

4

2 に答える 2

1

私は同じ問題を抱えていましたが、これが私がそれを解決した方法です。

CustomTableViewCell には、ラベルなどの値を設定する init メソッドがありました。

そのため、この条件を init に追加しました。

コード:

  • (void) initWithCellLabelString : (NSString *) cellLabelString {

    for (id subview in self.contentView.subviews) { [subview removeFromSuperview]; }

// 初期化の残り

}

それが役立つことを願っています。

EDIT これを行うより良い方法は、カスタムテーブルビューセルクラスでprepareForReuseをオーバーライドし、値をnilに設定することです。推奨される方法ではないかもしれませんが、パフォーマンスの問題は発生していません。

于 2013-10-10T16:43:07.797 に答える
0

私は実際にテストして自分で解決策を見つけました... 私の問題は、プロトタイプセルのテキストビューにアクセスするために、ストーリーボードでタグを付けたことです。

しかし、その後、 のテキストを編集したいときに、 を使用 する必要があったときに を使用していたcellForRowAtIndexPathので、最後のものを編集していたのでしょうか。[tableView viewWithTag:myTag][cell viewWithTag:myTag]

全体として、今は良いです..そして、間違ったセルまたはsmthを再利用することについて確信していたので、間違った場所を見ていました.. ios7でそれが起こらなかった理由を誰かが知っている場合は、共有してください!

于 2013-10-10T16:48:03.460 に答える