UITableViewCell没有显示detailTextLabel.text - Swift

时间:2014-12-01 02:50:57

标签: uitableview swift detailtextlabel

不显示详细信息(副标题)文本。但是,数据是可用的,因为当添加println()调用时,它会向控制台输出带有预期数据的Optional(“data”)。在故事板中,UITableViewController设置为正确的类,Table View Cell Style设置为“Subtitle”,重用标识符设置为“cell”。如何显示字幕信息?

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

    var cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as UITableViewCell

    dispatch_async(dispatch_get_main_queue(), { () -> Void in

        cell.textLabel.text = self.myArray[indexPath.row]["title"] as? String
        cell.detailTextLabel?.text = self.myArray[indexPath.row]["subtitle"] as? String

        println(self.myArray[indexPath.row]["subtitle"] as? String)
        // The expected data appear in the console, but not in the iOS simulator's table view cell.

    })
    return cell
}

13 个答案:

答案 0 :(得分:43)

您的代码看起来很好。只需转到故事板并选择您的tableview的单元格 - >现在转到Attributes Inspector并选择Subtitle样式。

按照以下截图进行操作。

Change this option

希望它有所帮助......

答案 1 :(得分:26)

这里有同样的问题(从我读过的内容,也许是iOS 8中的一个错误?),这就是我们解决这个问题的方法:

  1. 从故事板中删除原型单元

  2. 删除此行:

  3. var cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as UITableViewCell

    1. 替换为以下代码行:
    2. let cellIdentifier = "Cell"
      
      var cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as? UITableViewCell
      if cell == nil {
          cell = UITableViewCell(style: UITableViewCellStyle.Value2, reuseIdentifier: cellIdentifier)
      }
      

      更新Swift 3.1

      let cellIdentifier = "Cell"
      
      var cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier)
      if cell == nil {
          cell = UITableViewCell(style: UITableViewCellStyle.value2, reuseIdentifier: cellIdentifier)
      }
      

      Swift 4.2更新 - 简化

      let cell = UITableViewCell(style: UITableViewCell.CellStyle.value2, reuseIdentifier: "cellId")
      

答案 2 :(得分:15)

如果您仍想使用故事板中的原型单元格,请选择UITableViewcell样式作为字幕。它会起作用。

答案 3 :(得分:6)

如果以编程方式执行此操作而没有在界面构建器中使用单元格,则此代码的工作方式类似于Swift 2.0 +中的魅力

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    yourTableView.delegate = self
    yourTableView.dataSource = self
    yourTableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "subtitleCell")

}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return yourTableViewArray.count
}

func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
    let cell: UITableViewCell = yourTableView.dequeueReusableCellWithIdentifier("subtitleCell", forIndexPath: indexPath) as UITableViewCell

    cell.textLabel?.text = "the text you want on main title"
    cell.detailTextLabel?.text = "the text you want on subtitle"

    return cell
}

答案 4 :(得分:4)

如果在尝试将文本设置为非零值时将文本设置为nil,则将缺少包含该文本的实际视图。这是在iOS8中引入的。请尝试设置为空格@" "字符。

请参阅:Subtitles of UITableViewCell won't update

答案 5 :(得分:3)

enter image description here

尝试一下对我有用(Swift 4.2)

let cell = UITableViewCell(style: .value1, reuseIdentifier: "cellId")
cell.textLabel.text = "Déconnexion"
cell.imageView.image = UIImage(named: "imageName")

目标c:

UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"cellId"];

答案 6 :(得分:2)

它的价值:我没有出现细节问题。那是因为我已经注册了tableView单元格,因为单元格原型是直接在情节提要中定义的,所以我不应该这样做。

答案 7 :(得分:2)

在Xcode11和Swift5中,我们必须执行以下操作。 如果通过检查条件cell == nil然后使用cellStyle创建UITableViewCell来执行此操作,则它将不起作用。下面的解决方案为我工作。

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
           let cellIdentifier = "Cell"
            let cell = UITableViewCell(style: UITableViewCell.CellStyle.subtitle, reuseIdentifier: cellIdentifier)
    cell?.textLabel?.text = "Title"
    cell?.detailTextLabel?.text = "Sub-Title"

   return cell!
    }

答案 8 :(得分:0)

这是swift 5的工作原理,即在视图控制器中使用UITableView对象使用detailtextlabel获取字幕,如果您缺少其中任何一个,它将无法正常工作,并且可能会崩溃。

class ViewController: UIViewController, UITableViewDelegate,  UITableViewDataSource

在viewDidLoad中:

tableView.register(UITableViewCell.self, forCellReuseIdentifier: "subtitleCell")

代理功能:

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

    // Fetch a cell of the appropriate type.
    let cell = UITableViewCell(style: .subtitle , reuseIdentifier: "subtitleCell")

    // Configure the cell’s contents.
    cell.textLabel!.text = "Main Cell Text"
    cell.detailTextLabel?.text = "Detail Cell Text"

    return cell
}

答案 9 :(得分:0)

xcode 11

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    //        let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath)
    let cell = UITableViewCell(style: UITableViewCell.CellStyle.value1, reuseIdentifier: "reuseIdentifier")
    cell.detailTextLabel?.text = "Detail text"
    cell.textLabel?.text = "Label text"

    // Configure the cell...

    return cell
}

答案 10 :(得分:0)

以上某些解决方案并不完全正确。由于单元应该被重用,而不是重新创建。您可以更改init方法。

final class CustomViewCell: UITableViewCell {
    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: .value1, reuseIdentifier: reuseIdentifier)
    }

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

答案 11 :(得分:0)

带有字幕文本的 Swift 5,这里无需在 viewDidLoad 中注册您的单元格:

    var cell = tableView.dequeueReusableCell(withIdentifier: "cell")
       if cell == nil {
            cell = UITableViewCell(style: UITableViewCell.CellStyle.subtitle, reuseIdentifier: "cell")
       }
    
    cell?.textLabel?.text = "title"
    cell?.textLabel?.numberOfLines = 0
    cell?.detailTextLabel?.text = "Lorem ipsum"
    cell?.detailTextLabel?.numberOfLines = 0

    
    return cell ?? UITableViewCell()

答案 12 :(得分:0)

三个属性将在未来版本中弃用:imageView textLabeldetailTextLabel

您可以使用 UIListContentConfiguration 来配置单元

dataSource = UITableViewDiffableDataSource(tableView: tableview, cellProvider: { tableview, indexPath, menu in
        let cell = tableview.dequeueReusableCell(withIdentifier: self.profileCellIdentifier, for: indexPath)
        var content = cell.defaultContentConfiguration()

        content.text = menu.title
        if indexPath.section == MenuSection.info.rawValue {
            content.image = UIImage(systemName: "person.circle.fill")
            content.imageProperties.tintColor = AppColor.secondary
        }
        if let subtitle = menu.subTitle {
            content.secondaryText = subtitle
        }
        cell.contentConfiguration = content
        return cell
    })