如何在 UITableView 中使用多标签?

Posted

技术标签:

【中文标题】如何在 UITableView 中使用多标签?【英文标题】:How to use multi labels in UITableView? 【发布时间】:2019-04-01 14:22:23 【问题描述】:

我从 JSON(名字、姓氏和电子邮件)获取数据,但我只能在 UITableView 中显示名字。我尽了最大的努力,但我无法让它发挥作用。以下是我的代码。

import UIKit

struct User: Codable 
    let firstName: String
    let lastName: String
    let email: String

    enum CodingKeys: String, CodingKey 
        case firstName = "first_name"
        case lastName = "last_name"
        case email = "email"
    


class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate 

    @IBOutlet weak var tableview: UITableView!

    private var dataSource = [User]() 
        didSet 
            self.tableview.reloadData()
        
    

    override func viewDidLoad() 
        super.viewDidLoad()

        self.tableview.register(UITableViewCell.self, forCellReuseIdentifier: "groupCell")
        self.tableview.dataSource = self
        self.tableview.delegate = self

        let url = URL(string: "https://x.com/x.php")

        URLSession.shared.dataTask(with: url!, completionHandler:  [weak self] (data, response, error) in
            guard let data = data, error == nil else 
                print(error?.localizedDescription ?? "An error occurred")
                return
            

            DispatchQueue.main.async 
                self?.dataSource = try! JSONDecoder().decode([User].self, from: data)
            
        ).resume()
    

    override func viewDidAppear(_ animated: Bool) 
        super.viewDidAppear(animated)
        tableview.reloadData()
    

    func numberOfSections(in tableView: UITableView) -> Int 
        return 1
    

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return dataSource.count
    

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "groupCell", for: indexPath)
        let user = self.dataSource[indexPath.row]
        cell.textLabel?.text = user.firstName
        // cell.textLabel?.text = user.lastName  If I write this line then it only shows last name
        return cell
    


【问题讨论】:

看起来您正在使用默认 UITableViewCell 并且还有一个属性 detailTextLabel 可以与它​​一起使用。但是如果你想显示更多的数据你需要创建自定义UITableViewCell 另外,您可以将JSONDecoderkeyDecodingStrategy 设置为convertFromSnakeCase,这样就可以避免声明自己的CodingKeys 枚举 我更新了代码并创建了自定义标签,但 xcode 找不到我的标签。代码在上面。谢谢你的帮助。 @Dharmesh 你需要通过添加as! tableViewCellLabels来投射你的cell 我应该在哪里写这个?在最后一个函数而不是 UITableViewCell 之后 -> ? @Dharmesh 【参考方案1】:

你可以使用UITableViewCell.CellStyle.subtitle,像这样:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    var cell: UITableViewCell! = tableView.dequeueReusableCell(withIdentifier: "groupCell")
    if cell == nil 
        cell = UITableViewCell(style: .subtitle, reuseIdentifier: "groupCell")
    

    let user = self.dataSource[indexPath.row]
    cell.textLabel?.text = user.firstName + " " + user.lastName
    cell.detailTextLabel?.text = user.email
    return cell

你不需要注册单元格,所以删除以下行:

tableview.register(UITableViewCell.self, forCellReuseIdentifier: "groupCell")

【讨论】:

如果 OP 想要显示他的问题中描述的第三个标签怎么办? OP 似乎是新的,并用几个建议的答案更新了他的问题 :) 请查看原始问题 ***.com/revisions/55457408/1 注意 OP 的原始代码是 cell.textLabel?.text = user.firstNamecell.textLabel?.text = user.lastName,所以在我的意义上我们不需要您建议的自定义 uitableviewcell 首先您需要创建自定义 UITableViewCell,我们可以使用 UITableViewCell.CellStyle.subtitel 就可以了?

以上是关于如何在 UITableView 中使用多标签?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iphone 中刷新 UITableView?

如何在 UITableview 中对齐标签?

UI第十八节——UITableView

UITableView:向上滑动时收缩标签栏和导航栏

如何在 uilabel 中使用多行并根据 Swift 中的标签高度自动扩展 uitableview 行高?

如何在 UITableView 单元格中添加标签和图像视图的数量