Tableview单元格字幕

时间:2017-02-19 11:31:50

标签: ios iphone swift uitableview tableview

我使用此时未显示我的tableview单元格字幕:

grails:
   controllers:
       upload:
           maxRequestSize: 10000
           maxFileSize:  10000

multipart:
    maxRequestSize: 5MB
    maxFileSize:  5MB

但是如果我使用它:

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

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

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

顺便说一句。我的常规单元格标题正如我所希望的那样工作。没问题。

编辑:

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

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!
  }
}

和:

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

storyboard

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

这样做:

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

}

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

答案 2 :(得分:0)

最简单的解决方案:

直接在表格视图中设置Interface Builder中的两个单元格,将样式和附件视图设置为所需的值并添加标识符。

然后代码可以缩减为。

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
}

答案 3 :(得分:0)

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!
}

答案 4 :(得分:0)

今天也遇到了这个问题。我认为原始的发帖人找到了答案,但是对于将来遇到此问题的其他人来说,这就是我解决的方法。请注意,此链接/线程也说明了求解的其他方法。 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
    }