表格视图单元格字幕

Posted

技术标签:

【中文标题】表格视图单元格字幕【英文标题】:Tableview cell subtitles 【发布时间】:2017-02-19 11:31:50 【问题描述】:

当我使用这个时,我的 tableview 单元格字幕没有显示:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

var cell:UITableViewCell?

if tableView.tag == 1 

    guard let latestCell = tableView.dequeueReusableCell(withIdentifier: "latestCell") else 
        return UITableViewCell(style: .subtitle, reuseIdentifier: "latestCell")
    
    latestCell.textLabel?.text = latest[indexPath.row]

    latestCell.detailTextLabel?.text = latestSub[indexPath.row]

    latestCell.accessoryType = .disclosureIndicator

    return latestCell
   

但是如果我使用这个:

else if tableView.tag == 2 

    let olderCell = UITableViewCell(style: UITableViewCellStyle.subtitle, reuseIdentifier: "olderCell")



    olderCell.textLabel?.text = older[indexPath.row]

    olderCell.detailTextLabel?.text = olderSub[indexPath.row]

    olderCell.accessoryType = .disclosureIndicator

    return olderCell
   else 
    return cell!
  

字幕加载完美,但在我关闭应用程序并重新加载视图后,应用程序会自动退出,而不会提供崩溃日志或将我带到调试选项卡。

我知道数据来自的数组很好,我认为我已经在情节提要中正确设置了所有内容。关于这个主题已经发布了很多类似的问题,但它们似乎都归结为忘记将 cellStyle 设置为 .subtitle。提前感谢我得到的任何帮助!

顺便说一句。我的常规单元格标题就像我想要的那样工作。没问题。

编辑:

我认为问题在于我可以毫无问题地创建一个默认样式的单元格。但是当我尝试将样式设置为 .subtitle 时,它​​第一次正确加载,但第二次打开时,它崩溃了。有没有办法将这两个声明一起使用,而不会相互消除;

guard let latestCell = tableView.dequeueReusableCell(withIdentifier: "latestCell") else 
    return UITableViewCell(style: .subtitle, reuseIdentifier: "latestCell")

和:

let latestCell = UITableViewCell(style: UITableViewCellStyle.subtitle, reuseIdentifier: "latestCell")

【问题讨论】:

在你守卫的时候,你甚至没有设置它的属性就返回了单元格。第二个代码不重用单元格(不推荐)。 朋友我可以问你吗?你在使用两个 tableview 吗? 是的,我用了两个。 我解决了这个问题,结果发现 tableview 没有正确重新加载。在我修复了激活 tableview 的语句的顺序之后,它修复了它。谢谢大家的回复! 【参考方案1】:

旧但...

我认为问题是:

guard let latestCell = tableView.dequeueReusableCell(withIdentifier: "latestCell") else 
    return UITableViewCell(style: .subtitle, reuseIdentifier: "latestCell")

将返回一个“空”单元格。

所以..就像:

var latestCell = tableView.dequeueReusableCell(withIdentifier: "latestCell")

if latestCell == nil 
   latestCell = UITableViewCell(style: UITableViewCellStyle.subtitle, reuseIdentifier: "latestCell")


// your stuff

【讨论】:

【参考方案2】:

今天也遇到了这个问题。我假设原始发布者找到了答案,但对于将来遇到此线程的其他人来说,这就是我解决这个问题的方法。请注意,此链接/线程也解释了解决的其他方法。 How to Set UITableViewCellStyleSubtitle and dequeueReusableCell in Swift?

环境: Swift 5.0 和 Xcode 版本 10.2.1。

说明:我通过继承 UITabelViewCell 并使用 .subtitle 类型对其进行初始化来解决这个问题(参见下面的代码)。注意 super.init 方法中的 .subtitle。

一旦你有了子类,不要忘记将 CustomCell 注册到你的 tableView 并在你的 tableView 方法 cellForRowAt 中向下转换为 CustomCell。

class CustomCell: UITableViewCell 

    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) 
        super.init(style: .subtitle, reuseIdentifier: reuseIdentifier)
    

    required init?(coder aDecoder: NSCoder) 
        fatalError("init(coder:) has not been implemented")
    

这里是 cellForRowAt 方法的代码,它具有 titleLabel 和 detailTextLabel(subtitle) 属性。请注意向下转换的“as!CustomCell”。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> 
UITableViewCell 

        let cell = tableView.dequeueReusableCell(withIdentifier: "cellId", for: 
indexPath) as! CustomCell

            cell.textLabel?.text = someArray[indexPath.row].title // Note someArray would have to be replaced with your array of strings.
            cell.detailTextLabel?.text = someArray[indexPath.row].subtitle // Note someArray would have to be replaced with your array of strings.

        return cell
    

【讨论】:

【参考方案3】:

这样做:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 

    var cell:UITableViewCell = self.tableView.dequeueReusableCellWithIdentifier("latestCell") as UITableViewCell

    cell.textLabel?.text = latest[indexPath.row]
    cell.detailTextLabel?.text = latestSub[indexPath.row]
    cell.accessoryType = .disclosureIndicator

    return cell


如果这解决了您的问题,请将其标记为解决方案/点赞。

【讨论】:

恐怕这并没有将cellStyle设置为副标题,所以没有什么区别。【参考方案4】:

最简单的解决方案:

在界面生成器中直接在表格视图中设计两个单元格,将样式和附件视图设置为您想要的值并添加标识符。

那么代码就可以简化为。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
   switch tableView.tag 
   case 1:
   let latestCell = tableView.dequeueReusableCell(withIdentifier: "latestCell" for: indexPath)
      latestCell.textLabel!.text = latest[indexPath.row]
      latestCell.detailTextLabel!.text = latestSub[indexPath.row]
      return latestCell

   case 2:
      let olderCell = tableView.dequeueReusableCell(withIdentifier: "olderCell" for: indexPath)
      olderCell.textLabel!.text = older[indexPath.row]
      olderCell.detailTextLabel!.text = olderSub[indexPath.row]
      return olderCell

   default: 
      fatalError("That should never happen")
   


由于单元格预定义为字幕样式,textLabeldetailTextLabel 都保证存在并且可以安全地展开。

但是,单元格之间的显着差异是什么。从给定的代码中,您实际上可以使用一个单元格(标识符cell)。这可以使代码更短:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

   let cell = tableView.dequeueReusableCell(withIdentifier: "cell" for: indexPath)

   if tableView.tag == 1 
      cell.textLabel!.text = latest[indexPath.row]
      cell.detailTextLabel!.text = latestSub[indexPath.row]
    else 
      cell.textLabel!.text = older[indexPath.row]
      cell.detailTextLabel!.text = olderSub[indexPath.row]
   
   return cell

【讨论】:

这不会将样式设置为字幕,所以没有运气,我已经在情节提要中正确设置了我的单元格。但是感谢您的尝试! 如果在 Interface Builder 中设置了样式,它必须出现在重用的单元格中。 你这是什么意思?对不起,我不太明白。如果您指的是故事板单元格中设置的样式,那么是的,它会出现在那里。 是的,如果你在storyboard中设置了样式,它就会出现,你不需要在代码中设置。但是你必须在两个表格视图中设计单元格。 我编辑了帖子,有一个指向我的故事板屏幕截图的链接,我设置了两个原型单元格,它仍然无法正常工作。【参考方案5】:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") //replace "Cell" with your identifier
    cell.textLabel = yourTitleArray[indexPath.row]
    cell.detailTextLabel = yourSubtitleArray[indexPath.row]
    return cell!

【讨论】:

以上是关于表格视图单元格字幕的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 表格视图单元格未正确呈现

向动态视图单元格添加另一个字幕

应用于字幕表视图单元格的 UITableViewAutomaticDimension 无法正常工作

如何获得 UITableViewCell 字幕显示特定单元格被点击了多少次?

更改电池配件类型?

在每个单元格都包含表格视图的表格视图中选择新单元格时,无法取消选择先前选择的单元格