web-dev-qa-db-ja.com

再利用されているテーブルセルのインデックスパスがありません

これは突然起こり始めました。任意のアイデア:コード:

CUSTOMCLASSNAME(クライアントの名前が含まれているため、実際のクラス名を置き換えました。)

TableViewを初期化しています:

[self.tableView registerClass:[CUSTOMCLASSNAME class] forCellReuseIdentifier:[self reuseIdentifier]];

行のセル内:

こんにちは、タイトルはコンソールに印刷されています。これは私のcellForRowです:

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

    AVTCheckListTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:[self reuseIdentifier] forIndexPath:indexPath];

    [self configureCell:cell atIndexPath:indexPath];

    return cell;
}

- (void)configureCell:(AVTCheckListTableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {
    ChecklistGroup *group = [self.checklistFetchedResultsController.fetchedObjects objectAtIndex:indexPath.section];

    ChecklistItem *item = [self getChecklistItemForIndexPath:indexPath];

    [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
    [[cell cellTextView] setAttributedText:[[item checked] boolValue] ? [[NSAttributedString alloc] initWithString:[item name] attributes:@{ NSStrikethroughStyleAttributeName : @(NSUnderlineStyleSingle) } ] : [[NSAttributedString alloc] initWithString:[item name]]];
    [[cell cellTextView] setUserInteractionEnabled:[[group isUserDefined] boolValue]];
    [[cell cellTextView] setTag:indexPath.row];
    [[cell cellTextView] setDelegate:self];
    [[cell tickImage] setHidden:![[item checked] boolValue]];
}

//Method that returns re-use:

- (NSString *) reuseIdentifier {
    return @"CheckListTableView";
}
16
CW0007007

私は数日後にこれを解決しました。カスタムセルにtextViewがあり、contentViewに追加するときに、次のようにしました。

[self.cellTextView setClearsOnInsertion:YES];

これが問題の原因でした。他の誰かが同様の問題を抱えている場合に備えて。

ハッピーコーディング:-)

1
CW0007007

[cell contentView]からcellの代わりにtableView:viewForHeaderInSection:を返します

編集:これはどういうわけかUIボタンの長押しジェスチャでクラッシュを引き起こしました。それを修正するために、私はあきらめて、偽のセクションヘッダーとして単一のアイテムを持つ別のセクションを使用しました。

59
TalkLittle

viewForHeaderInSectionの実装中にこの警告が見つかりました。

これは私の解決策ですSwift 2.x

let headerView = self.tableView.dequeueReusableCellWithIdentifier("MyCell") as! MyCell
let containerView = UIView(frame:headerView.frame)
headerView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
headerView.myLabel.text = "section title 1"
containerView.addSubview(headerView)
return containerView

これはSwiftバージョンです:

let headerView = self.tableView.dequeueReusableCell(withIdentifier: "MyCell") as! MyCell
let containerView = UIView(frame:headerView.frame)
headerView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
headerView.myLabel.text = "section title 1"
containerView.addSubview(headerView)
return containerView
10

このエラーメッセージの原因を突き止めました。

UITableViewCellが通常のビューとして使用されていました。したがって、その 'indexPathは設定されませんでした。私たちの場合、1つはviewForHeaderInSectionによって返されていました。

お役に立てれば。

クリス

7
chrisoneiota

私の場合、このエラーはiPhone(iPadではなく)でのみ発生しました。これは、[self.tableView beginUpdates];以降[self.tableView endUpdates];[UIView transitionWithView:duration:options:animations:compeletion];内に配置したためです。修正するために、フェードとセルの高さの変更のアニメーション化ではなく、フェージングアニメーションを優先したため、開始/終了の更新を削除しました。

2
Jordan H

ヘッダービューセクションヘッダーにセルを使用している場合は、セルをコンテナに入れてからコンテナビューに戻して、「テーブルセルのインデックスパスが再利用されない」ことを防ぐ必要があります。以下のサンプルコード。

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    CustomerCellHeader *headerViewCell = [tableView dequeueReusableCellWithIdentifier:kCustomerCellHeaderIdentifier];
    headerView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
    [headerView addSubview:headerViewCell];
    return headerView;
}
1
Kit

さて、私はこれを理解しようとして一日の大部分を使用したので、うまくいけば、この代替の説明が他の誰かの時間を節約するでしょう。

読み込み時に時々このメッセージを表示するテーブルビューがありました。これは、ビューの読み込み中に発生したCoreDataオブジェクトのKVO通知が原因であることが判明しました。 (変更を監視すると、コントローラーは問題のテーブルビューでreloadDataを呼び出そうとしました。ビューの読み込みが完了するまでオブジェクトを監視しないことで修正されました(以前は、アクセサーを介して割り当てられたオブジェクトの監視を開始しました)

TLDR:メインスレッド以外からデータをリロードしようとしているかどうかを確認してください。

さらに良い:

これは、(私が実際にすべきだとわかったように)子管理オブジェクトコンテキストを使用し、適切なタイミングでメインスレッドのメインMOCに変更をマージする場合にのみ発生する問題です。

1
Jonathan Zhan

私の場合(かなりばかげたもの)、私はcellForRowAt内でif let構文を次のように使用しました。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if let cell = tableView.dequeueReusableCell(withIdentifier: "carCell", for:
    indexPath) as? carTableViewCell {
        // Did some stuff here
        return CarTableViewCell()
    else {
        return CarTableViewCell()    
    }
}

ご覧のとおり、私は汎用のcarTableViewCell()を返しましたが、それが私にその卑劣なエラーを与えたのです...誰かがハハ(:

ハッピーコーディング!

0
Gal Shahar

同じエラーが発生しましたが、理由は異なります。

UITextFieldの1つをFirstResponderに設定するカスタムUITableViewCellがありました。このカスタムセルの複数のインスタンスが返されているときにエラーが発生しました。

カスタムセルの最初のインスタンスのみをFirstResponderに設定するだけで、問題が解決しました。

0
GrindItOut

tableView:viewForHeaderInSectionUITableViewCellを返す際に問題が発生しましたが、[cell contentView]を返すとセル内のボタンがクラッシュし、セルの周りにビューラッパーを設定するのは無駄に思えました。代わりに、UITableViewCellクラスをUITableViewHeaderFooterViewに変更しましたが、それは魅力のように機能しました。

この問題が発生した場合:

UITableViewHeaderFooterViewでの背景色の設定は非推奨になりました。代わりにcontentView.backgroundColorを使用してください。

ペン先の背景色をデフォルトに変更することを忘れないでください。

0
Ben Chen

私も同じ問題を抱えていました。このメッセージは、スクロールしてセルを再利用すると表示されます。

多くの回答がviewForHeaderInSectionについて話しましたが、私はそれらを使用しませんでした。誰かが同様の問題を抱えている場合、私はここに私の解決策を示します。

各セル内のテキストフィールドにオブザーバーを追加しました。セルをリサイクルするときにオブザーバーを削除しなかったので、これがこの問題の原因となったオブザーバーであるかどうか疑問に思います。

そのため、セルが定義されたときにオブザーバーを削除しました。

問題は解決したようです。保証はできません。

0
Clarke Xun Gong

それはSwift 2.1で私を助けました

  func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView {
            let headerCell:SBCollapsableTableViewHeader = self.friendsInfoTableView.dequeueReusableCellWithIdentifier("HeaderCell") as! SBCollapsableTableViewHeader
            let containerView = UIView(frame:headerCell.frame)
            headerCell.delegate = self
            headerCell.titleLabel.font = UIFont.boldSystemFontOfSize(15)
            headerCell.titleLabel.text = "\(self.ObjectArray[section].sectioName)"
            headerCell.collapsedIndicatorLabel.text = collapsed ? "+" : "-"
            headerCell.tag = section
            headerCell.backgroundColor =  UIColor(red:72/255,green:141/255,blue:200/255,alpha:0.9)
            containerView.addSubview(headerCell)
            return containerView
    }
0
Jitendra