これは突然起こり始めました。任意のアイデア:コード:
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";
}
私は数日後にこれを解決しました。カスタムセルにtextViewがあり、contentViewに追加するときに、次のようにしました。
[self.cellTextView setClearsOnInsertion:YES];
これが問題の原因でした。他の誰かが同様の問題を抱えている場合に備えて。
ハッピーコーディング:-)
[cell contentView]
からcell
の代わりにtableView:viewForHeaderInSection:
を返します
編集:これはどういうわけかUIボタンの長押しジェスチャでクラッシュを引き起こしました。それを修正するために、私はあきらめて、偽のセクションヘッダーとして単一のアイテムを持つ別のセクションを使用しました。
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
このエラーメッセージの原因を突き止めました。
UITableViewCell
が通常のビューとして使用されていました。したがって、その 'indexPath
は設定されませんでした。私たちの場合、1つはviewForHeaderInSection
によって返されていました。
お役に立てれば。
クリス
私の場合、このエラーはiPhone(iPadではなく)でのみ発生しました。これは、[self.tableView beginUpdates];
以降[self.tableView endUpdates];
を[UIView transitionWithView:duration:options:animations:compeletion];
内に配置したためです。修正するために、フェードとセルの高さの変更のアニメーション化ではなく、フェージングアニメーションを優先したため、開始/終了の更新を削除しました。
ヘッダービューセクションヘッダーにセルを使用している場合は、セルをコンテナに入れてからコンテナビューに戻して、「テーブルセルのインデックスパスが再利用されない」ことを防ぐ必要があります。以下のサンプルコード。
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
CustomerCellHeader *headerViewCell = [tableView dequeueReusableCellWithIdentifier:kCustomerCellHeaderIdentifier];
headerView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
[headerView addSubview:headerViewCell];
return headerView;
}
さて、私はこれを理解しようとして一日の大部分を使用したので、うまくいけば、この代替の説明が他の誰かの時間を節約するでしょう。
読み込み時に時々このメッセージを表示するテーブルビューがありました。これは、ビューの読み込み中に発生したCoreDataオブジェクトのKVO通知が原因であることが判明しました。 (変更を監視すると、コントローラーは問題のテーブルビューでreloadDataを呼び出そうとしました。ビューの読み込みが完了するまでオブジェクトを監視しないことで修正されました(以前は、アクセサーを介して割り当てられたオブジェクトの監視を開始しました)
TLDR:メインスレッド以外からデータをリロードしようとしているかどうかを確認してください。
さらに良い:
これは、(私が実際にすべきだとわかったように)子管理オブジェクトコンテキストを使用し、適切なタイミングでメインスレッドのメインMOCに変更をマージする場合にのみ発生する問題です。
私の場合(かなりばかげたもの)、私は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()を返しましたが、それが私にその卑劣なエラーを与えたのです...誰かがハハ(:
ハッピーコーディング!
同じエラーが発生しましたが、理由は異なります。
UITextFieldの1つをFirstResponderに設定するカスタムUITableViewCellがありました。このカスタムセルの複数のインスタンスが返されているときにエラーが発生しました。
カスタムセルの最初のインスタンスのみをFirstResponderに設定するだけで、問題が解決しました。
tableView:viewForHeaderInSection
でUITableViewCell
を返す際に問題が発生しましたが、[cell contentView]
を返すとセル内のボタンがクラッシュし、セルの周りにビューラッパーを設定するのは無駄に思えました。代わりに、UITableViewCell
クラスをUITableViewHeaderFooterView
に変更しましたが、それは魅力のように機能しました。
この問題が発生した場合:
UITableViewHeaderFooterViewでの背景色の設定は非推奨になりました。代わりにcontentView.backgroundColorを使用してください。
ペン先の背景色をデフォルトに変更することを忘れないでください。
私も同じ問題を抱えていました。このメッセージは、スクロールしてセルを再利用すると表示されます。
多くの回答がviewForHeaderInSectionについて話しましたが、私はそれらを使用しませんでした。誰かが同様の問題を抱えている場合、私はここに私の解決策を示します。
各セル内のテキストフィールドにオブザーバーを追加しました。セルをリサイクルするときにオブザーバーを削除しなかったので、これがこの問題の原因となったオブザーバーであるかどうか疑問に思います。
そのため、セルが定義されたときにオブザーバーを削除しました。
問題は解決したようです。保証はできません。
それは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
}