【问题标题】:Custom UITableViewCell is reloaded with new data but not drawn with new data自定义 UITableViewCell 用新数据重新加载,但没有用新数据绘制
【发布时间】:2016-02-06 08:50:01
【问题描述】:

我有一个具有以下结构的自定义 uitableviewcell

customCell
  Content View
    vertical Stack View
      title Label
      horizontal Stack View
        Label
        Label
      horizontal Stack View
        Label
        Label

点击有一个细节视图控制器的segue。回来后,我在主任务中重新加载 tableView。

我看到发生了以下情况:

A.没问题:

  1. 表格视图为空,我按下添加按钮
  2. 详细信息编辑器打开,编辑所有标签的数据
  3. 返回 UITableView
  4. -> 绘制所有内容-> 没问题。
  5. 在编辑相应内容时使用新数据重绘。

B.问题

  1. 表格视图为空,我按下添加按钮
  2. 详细信息编辑器打开,编辑前 3 个标签的数据,而不是底部 2 个标签的数据
  3. 返回 UITableView
  4. -> 绘制已编辑的标签,调整布局以使底部水平堆栈视图不占空间
  5. 再次进入同一个单元格的详细信息编辑器,为底部 2 个标签添加文本
  6. 返回表格视图控制器
  7. -> 问题:底线仍未绘制
  8. 但调试器显示单元格已渲染且数据可用且标签文本已设置

我在主线程中调用 reloadData()。不这样做通常是导致 UITableViewCells 更新丢失的原因。在这种情况下不是。

-> 我有一个解决方法,请参阅下面的答案。应用此解决方法可以解决问题。

按要求编辑:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier(workoutCellIdentifier2, forIndexPath: indexPath) as! WorkoutTableViewCell
    let workout = appDelegate.persistence.workouts[indexPath.row]
    cell.setWorkout(workout, healthData: appDelegate.healthData)
    return cell
}

它永远不会进入后备路径

【问题讨论】:

  • 您能出示您的cellForRowAtIndexPath 代码吗?
  • 还有你的heightForRowAtIndexPath。您是否考虑过将两个堆栈视图放在垂直堆栈视图中,然后根据需要隐藏/取消隐藏较低的水平堆栈视图
  • 你在下面看到我的回答了吗?
  • 隐藏/取消隐藏不是必需的。它是由一些 Apple 代码自动完成的。这就是问题的原因。
  • dequeueReusableCellWithIdentifier:forIndexPath 永远不会返回 nil,因此它永远不会采用回退路径。您是否正确地重新配置了setWorkoutprepareForReuse 中的单元格?

标签: ios iphone uitableview redraw


【解决方案1】:

当单元格包含空标签(文本 == nil)时,我显示单元格的布局过程优化了底线

前两行获得更多的垂直空间。

稍后设置标签文本时,布局过程不会反转。 setNeedsLayout() 没有帮助。因此,即使在重绘时它现在包含数据,底线仍然被优化掉。

解决方法:

切勿在单元格中将标签文本设置为 nil。当没有可用数据时将其设置为“ ”。

现在,底线永远不会被优化掉。剩余的空白区域表示尚未设置某些内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-06
    • 2021-11-24
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多