【问题标题】:UITableView separator lines erratic in displayingUITableView 分隔线在显示中不稳定
【发布时间】:2014-04-25 02:09:20
【问题描述】:

我有一个自定义 UITableViewCells 的表格视图,当它们被触摸时会展开和收缩(以显示信息)。不幸的是,根据交互的位置,某些单元格的分隔符(在单元格框架的顶部/底部)会消失。它使它们看起来好像两个单元格合二为一。

以下是我认为相关的代码(如果需要更少/更多,请告诉我):

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    DynamicTableViewCell *selectedCell = (DynamicTableViewCell *)[tableView cellForRowAtIndexPath:indexPath];
    Trinomial *currentTri = [self.fetchedResultsController objectAtIndexPath:indexPath];
    switch (currentTri.cellDetailActive) {
    case YES:

        selectedCell.detailLabel.hidden = YES;
        [selectedCell setSelected:NO animated:YES];
        currentTri.cellDetailActive = NO;
        [tableView beginUpdates];
        [tableView endUpdates];

        break;
    case NO:

        selectedCell.detailLabel.hidden = NO;
        [selectedCell setSelected:NO animated:YES];
        currentTri.cellDetailActive = YES;
        [tableView beginUpdates];
        [tableView endUpdates];

        break;

    default:
        NSLog(@"Serious application error. BOOLEAN contains no value in -[tableView:didSelectRowAtIndexPath:]");
        break;
  }
}

这里是设置行高的方法:

- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

Trinomial *tri = [self.fetchedResultsController objectAtIndexPath:indexPath];

if (!tri.cellDetailActive)
    return 55;
else
    return 110;
}

我的问题的图片发布在下面。过程是单元格持有一个属性,告诉是否显示详细信息,我使单元格高度发生变化(通过-[beginUpdates:]-[endUpdates:]),然后隐藏或取消隐藏一些视图,具体取决于最后的显示模式。

如果我需要澄清/详细说明任何信息或提供任何其他材料,请告诉我。提前感谢您的帮助!

编辑: 不知何故,我将此方法的两个版本合并在一起,其中代码不正确。 -[tableView:didSelectRowAtIndexPath:] 的工作原理是从 Core Data 获取的结果控制器接收到一个对象,其中包含一个名为 cellDetailActive 的属性,用于检查单元格是否展开。该单元格没有 cellDetailActive 属性,抱歉。

编辑#2: 好的,我向 Apple Bug Reporter (#17295019) 提交了一个名为“表格视图单元格分隔符随着单元格高度变化而消失”的错误。好吧,这个标题有点误导,因为 Apple 的开发人员回复我说因为 -[setSelected:animated] 直接在表格视图单元格上被调用,所以我遇到了分隔符问题。相反,建议在我的 switch 语句中使用[tableView selectRowAtIndexPath:animated:scrollPosition] 以及[tableView deselectRowAtIndexPath:animated]

【问题讨论】:

  • 你如何在 - (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 中获得“currentTri”
  • 抱歉,Trinomial *currentTri = [self.fetchedResultsController objectAtIndexPath:indexPath]; 隐藏在其中,可能在复制时遗漏了。
  • 离题,但使用带有BOOL 的开关可能会由于使用不一致而导致不可预知的结果。如果您尝试执行三元逻辑,则应使用枚举:typedef NS_ENUM(NSInteger, States) { Unknown, Off, On }。否则,if (currentTri.cellDetailActive) {} else {} 是最安全的。
  • @BrianNickel 我今天在 Xcode 中收到了同样语义问题的意外警告。完全按照您的方式进行操作,现在可以正常工作。感谢您的意见。

标签: ios objective-c uitableview


【解决方案1】:

我认为这只是一个错误。我解决它的方法是将分隔符设置为 None 并绘制我自己的单元格背景,其中包括一条用作分隔符的线。

【讨论】:

  • 这是表格视图的错误,我可以向 Apple 报告吗?还是我无法解决的代码中的错误?好的,我会这样做的。谢谢。
  • 如果您可以在代码的简单版本中始终如一地重现它,当然,请向 Apple 报告。我将此报告为错误 #15005911,“重新加载选定的 UITableViewCell 会删除其分隔符”。它似乎在 iOS 7.0.3 中已修复,但可能没有。
  • 是的,我会看看我能做什么。我正在运行 iOS 7.1 SDK(和 7.1 开发设备),所以它至少对我来说不是固定的。感谢您的建议和反馈!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-15
  • 2021-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-12
相关资源
最近更新 更多