轻扫删除单元格导致tableViewHeader与单元格移动

我在iOS 8的UITableView上遇到了一个奇怪的bug。当在单元格上滑动以显示删除button(标准的iOS swipe-to-delete)时,它会移动tableViewHeader以及正在被滑动的单元格。 当我滑动单元格时,标题的移动方式与正在滑动的单元格相同。 表格视图中没有其他单元格被移动,只有标题和任何单元格被移动。 我已经testing了这个在iOS 7上没有遇到的问题。 对我来说,这似乎是tableViewHeader中的tableViewHeader一个bug,因为它只发生在这个版本,似乎永远不会发生。 我看不出有什么理由将头部包含在滑动删除中。

下面只是一个模型。 在应用程序中的滑动删除是默认的iOS,没有任何习惯。

下面只是一个模型。在应用程序中的滑动删除是默认的iOS,没有任何习惯。

基于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 } 

这是因为我使用UITableViewCell作为表头。 要解决滑动问题,而不是使用tableView.tableHeaderView = cell ,我使用以下内容:

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

我不知道为什么这个解决了这个问题,特别是它在iOS 7上工作,但似乎解决了这个问题。

确保将所有视图添加到单元格视图中,如同单元格contentView一样,否则button将不会响应。

作品:

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

不起作用:

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

避免使用单元格移动标题的方法是在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; } 

SWIFT 3.0经testing的解决scheme。 正如在Objective-C的第一个例子中提到的那样; 关键是返回cell.contentView而不是单元格所以新格式的语法如下。

 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 } 

试着实现这个方法,并给出检查swipe的适当条件。如果这个方法被调用了header view。

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

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

维克多的背景颜色丢失的问题,解决了布拉德的答案:

 cell.backgroundColor = UIColor.cyanColor() 

至:

 cell.contentView.backgroundColor = UIColor.cyanColor() 

如果在添加cell.contentView之后,该部分变为空白,则必须转到属性检查器并确保通用尺寸类是check(它说“已安装”)。 很可能你正在使用wRhR或类似的东西。 您必须通过表格的每个元素和约束,并勾选已安装的checkbox。