【问题标题】:detailTextLabel not showing initiallydetailTextLabel 最初没有显示
【发布时间】:2012-03-30 13:54:07
【问题描述】:

我正在使用静态 UITableview,设置在情节提要中。对于某些单元格(样式 = 右细节),我在 viewWillAppear 中设置了 detailTextlabel.text,如下所示:

   self.recentProductsCell.detailTextLabel.text = description;

对于这个单元格,标签不会出现。如果我 NSLog 显示的文本没问题。 我检查了 detailTextLabel 没有隐藏。 我没有更改情节提要中的任何其他属性。 该单元格有一个 detailDisclosure 附件,但将其设置为其他内容并没有帮助。

然后奇怪的事情: 如果我运行并且没有显示 detailTextlabel,我通过点击它并移动我的手指来选择该行。从那时起,detailTextLabel 确实显示了!即使隐藏和重新显示视图,标签仍然可见。然而,在代码中重置和设置它会使标签再次消失。

我可能做错了什么,或者这是一个错误?

已编辑:在 5.0 和 5.1 中均已检查,行为相同。 通过在 viewWillAppear 中的代码中选择和取消选择这一行,我发现了一个丑陋的解决方法。所以我补充说:

[self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:3 inSection:0] animated:NO scrollPosition:UITableViewScrollPositionNone];
[self.tableView deselectRowAtIndexPath: [NSIndexPath indexPathForRow:3 inSection:0] animated:NO];

它有效,但我可以看到该行被选中和取消选中。所以我也更改了 selectionStyle,但是现在显示视图时这一行会闪烁。

补充说明:在同一个viewWillAppear中,我设置了其他静态单元格的detailLabel,它们显示得很好。

【问题讨论】:

  • 您能否发布相关代码(如果有)以用于单元格的创建和重用?关于为什么会发生这种行为,我仍然有一些理论,但我需要查看更多代码来确定它。
  • 对不起。也许复活节过后,小假期就要来了。我觉得很奇怪,我想尝试从头开始在项目构建中重现并向 Apple 提交错误报告。只是为了体验。但这需要一些时间。也许星期二。感谢您现在的关注。

标签: iphone uitableview


【解决方案1】:

我确实发现了 detailLabel 什么时候没有出现,而不是为什么,恕我直言,这是一个错误。

如果 detailLabel.Text 的先前值为 nil 或空字符串,则将 detailLabel 设置为新值后不会显示。 如果我将 detailLabel 设置为 nil/empty 以外的任何其他值(最初),然后将其设置为其他值,则新值会正确显示。

不显示的原因可能比之前只是空的更复杂,但就我而言,这解决了我的问题。如果我希望它是“空的”,我可能可以在背景颜色中显示 detailLabel。

【讨论】:

  • 谢谢,来自苹果的另一个奇怪的错误。
  • 2019 - 仍然是错误 :-)。当我选择行时,会出现详细标签
【解决方案2】:

我有这个问题的副本。相同的配置 - 故事板中的静态单元格,但带有左侧细节单元格。我还看到了触摸单元格使其可见的问题。

我通过将情节提要中的初始详细标签内容设置为单个空格来解决此问题。在代码中设置了实际的详细标签内容后,我向详细标签发送了一条 sizeToFit 消息。

【讨论】:

  • 我又遇到了这个错误,现在更有经验了。您的答案是正确的,因为在情节提要中设置初始值会有所帮助。我不需要将 sizeToFit 发送到详细标签。在调试器中检查时,如果情节提要中未指定默认值,我发现 detaillabel 的大小和来源不正确。仅发送 sizeToFit 确实会更改帧的大小,但不会更改原点。我的问题解决了。
  • 适合我的尺寸对我来说是一个很好的解决方法。有人向 Apple 报告过此事吗?
【解决方案3】:

尝试设置单元格Style = subtitle

【讨论】:

  • 同样的问题仍然存在。最初不显示字幕,但在选择行后显示。主标题最初居中显示,然后弹出到顶部为 detailLabel 腾出空间。
【解决方案4】:

您将标签设置在错误的位置。

发布您的 UITableViewDelegate / DataSource 代码。您需要在cellForRowAtIndexPath:willDisplayCellAtIndexPath: 中设置此值

【讨论】:

  • 不,因为我使用的是静态单元格,通过将 UITableView 的属性检查器中的内容设置为:静态单元格在情节提要中创建。另请参阅以下问题的答案:link
  • 您仍然可以使用willDisplayCellAtIndexPath。这将允许您在单元格在屏幕上绘制之前立即进行最终更改。
  • 唉,willDisplayCellAtIndexPath 仅在第一次为静态单元格构造 tableview 时触发,来自: -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:withIndexPath:] 。之后,当显示单元格时,不会触发此方法。 (是的,委托被设置为控制器..)。
  • 我也尝试将代码移动到 tableView: cellForRowAtIndexPath: 但结果是一样的。并非每次出现表时都会调用此方法,而只是在初始创建时调用此方法。我的 tableView 永远不会被释放,因为它是 splitViewController 中的主人。也许我应该强制释放隐藏?
  • 顺便说一句:我尝试了 cellForRowAtIndexPath 因为文档说这是正确的方法:link
【解决方案5】:

您是否将所有控件添加到 UITableViewCell 的contentView?如果您只是将其添加到单元格中,这有时会导致行为不稳定。

【讨论】:

  • 我正在使用预定义类型 UITableViewCellStyleValue2(通过在 IB 中选择 Style = Right Detail)。所以我不做自定义控件。
【解决方案6】:

我遇到了同样的问题,我认为这是一个错误。 如果我按住这条线,我会看到 detailTextLabel。

正如 Bjinse 所说,如果您之前将 detailTextLabel 设置为 nil 或“”(没有空格 = 空字符串),通常会发生这种情况。

所以我结束了将我想要为空的 detailTextLabel 设置为“”(带空格)。这对我有用。

【讨论】:

    【解决方案7】:

    我发现它只发生在 iPhone 6plus(8.4) 上。

    解决方案 1(建议):

    不重复使用单元格后,问题解决了。

    //var cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier)
    //if cell == nil {
    //    cell = UITableViewCell(style: .Value1, reuseIdentifier: cellIdentifier)
    //}
    
    var cell = UITableViewCell(style: .Value1, reuseIdentifier: cellIdentifier)
    

    解决方案 2:

    因为滚动或触摸后会显示文本,所以我决定重新加载数据。这也有效,但视图显示和 detailText 文本显示之间存在延迟。

    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        tableView.reloadData()
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-26
      • 1970-01-01
      相关资源
      最近更新 更多