滑动以删除单元格会导致tableViewHeader与单元格一起移动

时间:2014-09-24 06:09:02

标签: ios objective-c uitableview ios8

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

以下只是一个模型。在应用程序中滑动删除是默认的iOS,没有任何自定义。

Below is just a mockup. Swipe-to-delete within the app is default iOS, nothing custom.

7 个答案:

答案 0 :(得分:49)

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

答案 1 :(得分:25)

这是因为我使用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]

答案 2 :(得分:9)

避免标题随单元格移动的方法是返回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; 
}

答案 3 :(得分:3)

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
}

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

.contentView方法未提及的一个问题是,如果表视图单元格使用layoutSubviews,则可能无法获得所需的行为 - 因为不会调用layoutSubviews。我最终创建了一个完全独立的UIView子类,它支持正常的单元操作和头操作,并创建一个使用它的最小UITableView单元类。

答案 6 :(得分:-1)

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

cell.backgroundColor = UIColor.cyanColor()

要:

cell.contentView.backgroundColor = UIColor.cyanColor()