没有重用表单元格的索引路径

时间:2013-08-28 14:22:15

标签: ios tableview reusability tableviewcell

这开始发生了。任何想法:代码:

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";
}

13 个答案:

答案 0 :(得分:59)

[cell contentView]

返回cell而不是tableView:viewForHeaderInSection:

编辑:这在某种程度上导致了UI按钮上的长按手势崩溃。为了解决这个问题,我放弃了另一个使用单个项目的部分作为假部分标题。

答案 1 :(得分:10)

我在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 3 版本:

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

答案 2 :(得分:7)

我刚刚找到了此错误消息的原因。

UITableViewCell被用作普通视图。因此它的' indexPath未设置。在我们的案例中,viewForHeaderInSection返回了一个:

希望这有帮助。

克里斯

答案 3 :(得分:2)

在我的情况下,此错误仅在iPhone(而不是iPad)上显示,因为我在[self.tableView beginUpdates];内放置了[self.tableView endUpdates];和更晚[UIView transitionWithView:duration:options:animations:compeletion];。为了解决这个问题,我刚刚删除了开始/结束更新,因为我更喜欢淡化动画而不是淡化加上动画单元格高度变化。

答案 4 :(得分:1)

几天后我就解决了这个问题。在我的自定义单元格中,我有一个textView,当我将它添加到contentView时,我正在这样做:

[self.cellTextView setClearsOnInsertion:YES];

这是问题的原因;任何其他人都有类似的问题。

快乐编码: - )

答案 5 :(得分:1)

好吧,我只是用了一天中的大部分时间试图解决这个问题,所以希望这个替代解释可以节省其他人一些时间。

我有一个tableview,在加载时有时会发出这条消息。事实证明,这是由加载视图时触发的Core Data对象的KVO通知引起的。 (在观察到更改时,我的控制器尝试在相关的tableview上调用reloadData。修复了在视图加载完成之前没有观察对象(之前我开始通过访问器分配对象时开始观察对象)

TLDR:检查您是否尝试从主线程以外的其他位置重新加载数据。

更好:

如果您(正如我发现您确实应该)使用子托管对象上下文并且仅在合理时间将更改合并到主线程上的主MOC中,那么您将不会遇到此问题。

答案 6 :(得分:1)

如果您使用单元格作为标题视图部分标题,则必须将其放入容器中,然后返回容器视图以防止"表格单元格没有索引路径被重用"。示例代码如下。

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

答案 7 :(得分:0)

我在UITableViewCell中返回tableView:viewForHeaderInSection时遇到了问题,但返回[cell contentView]导致单元格内的任何按钮崩溃,并且在单元格周围设置视图包装似乎很浪费。相反,我将UITableViewCell课改为UITableViewHeaderFooterView,它就像一个魅力!

如果您遇到此问题:

  

不推荐在UITableViewHeaderFooterView上设置背景颜色。请改用contentView.backgroundColor。

请记住将笔尖上的背景颜色更改为默认值。

答案 8 :(得分:0)

我有同样的问题。滚动时会显示此消息并重复使用单元格。

很多答案都谈到了viewForHeaderInSection,但我并没有使用它们。如果有人遇到类似的问题,我特此展示我的解决方案。

我在每个单元格内的文本字段中添加了观察者。我想知道这是否是引起这个问题的观察者,因为当细胞被回收时我没有移除观察者。

所以当一个细胞被去除时,我移除了观察者。

似乎问题已经解决了。我无法保证。

答案 9 :(得分:0)

它帮我快速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
    }

答案 10 :(得分:0)

我收到了同样的错误,但原因不同。

我有一个自定义UITableViewCell,它将UITextField中的一个设置为firstFirstResponder。返回此自定义单元格的多个实例时发生错误。

我只是将自定义单元格的第一个实例设置为firstFirstResponder,它解决了问题。

答案 11 :(得分:0)

就我而言(非常愚蠢),我在if let内使用了cellForRowAt语法:

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(),这就是给我带来卑鄙错误的原因...... 我希望它能帮助别人哈哈(:

快乐的编码!

答案 12 :(得分:-1)

您可以尝试以下方法(假设您没有针对该索引路径上的单元格的任何特定配置): -

CustomClassName *cell=[tableView dequeueReusableCellWithIdentifier:[self reuseIdentifier]];
if(cell==nil)
{
cell=[[CustomClassName alloc] initWithStyle:whatever_style reuseIdentifer:[self reuseIdentifier]];
}

如果以上操作不起作用,请发布您获得的错误。

另请查看以下链接: -

What is the meaning of the "no index path for table cell being reused" message in iOS 6/7?