【问题标题】:Swipe to delete cell causes tableViewHeader to move with cell滑动删除单元格导致 tableView 标题随单元格移动
【发布时间】:2014-11-18 12:33:10
【问题描述】:

我在 iOS 8 中的 UITableView 上的 tableViewHeader 遇到了一个奇怪的错误。当在单元格上滑动以显示删除按钮(标准 iOS 滑动删除)时,它会移动 tableViewHeader与正在刷卡的单元格。当我滑动单元格时,标题的移动方式与被滑动单元格的移动方式相同。表格视图中没有其他单元格被移动,只有标题和正在滑动的任何单元格。我在 iOS 7 上测试过,没有遇到这个问题。对我来说,这似乎是 iOS 8 中tableViewHeader 的一个错误,因为它只发生在这个版本中,而且似乎永远不应该发生。我认为没有理由将标题包含在滑动删除中。

下面只是一个模型。应用内的滑动删除是默认的 iOS,没有自定义。

【问题讨论】:

  • 详细发送您的问题@Ferris
  • 我也遇到了这个问题,我很惊讶没有其他人有这个问题。你是如何创建标题的?我通过原型单元创建它并将它们重用为标题。不过,我还没有尝试过默认标题或从头开始创建一个新标题(代码)。
  • 我还想指出,任何滑动都会导致不仅它自己的节标题随之移动,而且所有其他节标题也会随之移动。你这边也一样吗?
  • 修复了这个问题。如果您使用 UITableViewCell 作为表的标题,请将其包装在 UIView 中。请参阅下面的答案。 @Cyber​​Mew
  • 我会推荐 @ferris 建议的将标题单元格包装在 UIView 中的方法。我尝试了以下引用 cell.contentView 的方法,但我的单元格上的某些按钮不会显示。

标签: ios objective-c uitableview ios8


【解决方案1】:

基于 ferris 的回答,我发现使用 UITableViewCell 作为节标题时最简单的方法是在 viewForHeaderInSection 中返回单元格的 contentView。代码如下:

override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let  cell : cellSectionHeader = tableView.dequeueReusableCellWithIdentifier("SectionHeader") as cellSectionHeader
    return cell.contentView
    //cellSectionHeader is my subclassed UITableViewCell
}

【讨论】:

  • 这对我很有用。我只需要在返回的单元格中添加“.contentView”即可。
  • 当我添加 .contentView 时,我只得到空白而不是正确的标题
  • @Carlos 我在使用标准的“基本”单元时也遇到了同样的情况。将其更改为自定义有效。
  • @SimonB 是的,我最终使用了一个单独的 xib 文件。工作。
  • 我相信在此之后头部的背景颜色会丢失。
【解决方案2】:

这是因为我使用 UITableViewCell 作为表格的标题。为了解决刷卡问题,我不使用tableView.tableHeaderView = cell,而是使用以下内容:

UIView *cellView = [[UIView alloc] init];
[cellView addSubview:cell];
tableView.tableHeaderView = cellView

我不知道为什么这可以解决问题,尤其是它在 iOS 7 上运行,但它似乎解决了问题。

确保将所有视图添加到单元格视图中,就像单元格 contentView 一样,否则按钮将不会响应。

作品:

[cell addSubview:view]; 或 [self addSubview:view];

不起作用:

[cell.contentView addSubview:view] 或 [self.contentView addSubview:view]

【讨论】:

  • 我刚试了一下,效果很好。但是我在标题单元格中有一个按钮,它不再响应触摸。就好像 userInteractionEnabled 设置为 NO,即使我确保所有这些都是 YES。
  • 遇到了同样的问题。我发现如果将对象添加到单元格 contentView 中,则它们没有响应。如果将它们添加到单元格视图中,它们可以正常工作。例如:[cell addSubview:view]; 或在自定义单元格中:[self addSubview:view];@Cyber​​Mew
  • 我修好了。我没有直接将单元格添加到 UIView,而是添加了 cell.contentView。这种方式没有其他任何改变 - 你仍然在故事板中制作你的单元格。现在一切正常。即使是我点击标题并导致第一行被选中的旧问题现在也已修复:)。在我的情况下,我最初将主拆分视图修改为更宽的宽度,因此作为一个额外步骤,我现在还必须设置 cell.contentView 的框架和边界(当然还有故事板中的约束)以使其在 iOS7 上看起来正确和iOS8。感谢您以正确的方式指出我! :)
  • 这是我使用的代码(在 viewForHeaderInSection 中):UIView *cellView = [[UIView alloc] initWithFrame:headerView.contentView.bounds]; [cellView addSubview:headerView.contentView]; // headerView is the cell from dequeue return cellView;
  • 谢谢,很高兴能帮上忙! @Cyber​​Mew
【解决方案3】:

避免表头随单元格移动的方法是在viewForHeaderInSection中返回单元格的contentView。如果您有一个名为 SectionHeaderTableViewCell 的子类 UITableViewCell,那么这是正确的代码:

-(UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    SectionHeaderTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SectionHeader"];
    //Do stuff to configure your cell
    return cell.contentView; 
}

【讨论】:

  • 这对我有用。我的标题有一个子类自定义单元格,并返回了该单元格实现的 contentView。滑动删除该部分下面的行不会滑动标题单元格,
【解决方案4】:

SWIFT 3.0 经过测试的解决方案。正如在 Objective-C 的第一个示例中所述;关键是返回 cell.contentView 而不是 cell 所以新的格式语法如下。

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

    // HeaderCell is the name of custom row designed in Storyboard->tableview->cell prototype
    let cell = tableView.dequeueReusableCell(withIdentifier: "HeaderCell")

    cell.songLabel.text = "Your Section Name"
    return cell.contentView
}

【讨论】:

  • 在我的单元格中,我使用“self.addSubview(customComponent)”以编程方式添加了所有自定义组件(如标签)。使用这个提议的解决方案,我还必须将其更改为“self.contentView.addSubview(customComponent)”。
【解决方案5】:

尝试实现此方法并提供检查滑动的适当条件。如果此方法被调用以获取标题视图。

1.tableView:editingStyleForRowAtIndexPath: 2.tableView:titleForDeleteConfirmationButtonForRowAtIndexPath: 3.tableView:shouldIndentWhileEditingRowAtIndexPath:

【讨论】:

  • 这似乎不能解决任何问题。 tableView:shouldIndentWhileEditingRowAtIndexPath: 永远不会被调用。我相信这适用于分组表。至于editingStyleForRowAtIndexPath:,它只会为正在刷卡的单元格调用一次。无论如何感谢您的帮助。
【解决方案6】:

.contentView 方法没有提到的一个问题是,如果您的表格视图单元格使用 layoutSubviews,您可能无法获得您想要的行为——因为 layoutSubviews 不会被调用。我最终创建了一个完全独立的 UIView 子类,它支持正常的单元格操作和标题操作,并创建了一个使用它的最小 UITableView 单元格类。

【讨论】:

    【解决方案7】:

    维克多失去背景颜色的问题,通过以下补充布拉德的答案得到解决:

    cell.backgroundColor = UIColor.cyanColor()
    

    收件人:

    cell.contentView.backgroundColor = UIColor.cyanColor()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-12
      • 1970-01-01
      • 2012-02-17
      • 1970-01-01
      • 2017-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多