【问题标题】:Repeat a label in TableViewCell在 UITableViewCell 中重复一个标签
【发布时间】:2017-05-18 19:31:43
【问题描述】:

请看下面的截图。

我也需要该解决方案才能在 iOS 8 中运行。堆栈视图在 iOS 8 中没有帮助

我被分配了这个模型...我不完全知道如何在 tableViewCell 中重复特定标签。如您所见,我需要根据 JSON 数据中的项目重复紫色标签和白色标签..

【问题讨论】:

  • 你能有任意数量的这种标签,还是只有 0、1 或 2 个?如果是,请准备好这些案例,并在必要时隐藏它们。
  • @Larme 你能详细说明一下.. 当你提到 0,1,2 时你在说什么
  • 紫色标签,如果你只能使用一次或两次(但不能在同一个单元格中使用 32 次),那就更容易了。但首先,你能自定义你的UITableViewCell吗?
  • 你能解释一下关于重复紫色标签和白色标签的更多信息吗?
  • 白色标签有加油站名称,紫色标签有加油站的加仑量。紫色标签和白色标签的数量总是相等的......而且这个数字不会超过5. 所以我们可以为一个特定的订单提供最多 5 个站点

标签: ios objective-c swift uitableview uilabel


【解决方案1】:

storyboard 中,您必须有两个UILabel,每个用于白色和紫色。如果Json 有数据,则分配它,否则执行以下代码

cell.label1.frame.size.height = 0
cell.label2.frame.size.height = 0

注意:请注意您对UITableViewCell 中的组件的约束。

【讨论】:

  • 我听不懂你的回答
  • 这会导致你的单元格布局出现很多问题,所以我不推荐这种方法。
  • 我这样做已经好几个月了,我从来没有遇到任何麻烦,即使它对我来说是最好的。 @BenjaminLowry 如果您有任何其他方法,很高兴听到。
  • 我同意@Larme 关于为不同的替代方案创建自定义单元类的观点。这样,您可以更轻松地确定 UI 的特征。您建议的方法要么在标签之间留下太多空间(仅仅因为高度为零并不意味着中间标签不存在),要么只会导致标签之间有空格,这不会也不好看。如果您使用的是原型单元格,那么弄乱单元格的高度不是一个好主意,如果您以编程方式执行此操作,则只需添加/不添加标签子视图。
  • 我正在 DVing 这个答案,因为我怀疑它的有效性和它回答 OPs 问题的能力。
【解决方案2】:

这是用户UIStackView的完美场景,在Stack View中添加5个标签并隐藏(.isHidden属性)你不想显示的标签,这会导致堆栈视图根据其中存在的标签数量收缩扩展

我希望您已经了解 Stack View,如果没有,那么您必须查找基本的在线教程。

【讨论】:

  • 我去看看
  • 如何在 iOS 8.0 中执行此操作,因为堆栈视图在少于 9 个版本的 iOS 中不可用
  • 是的,我已经在 iOS 10 中实现了它,但我也需要该项目在 iOS 8 中工作
【解决方案3】:

根据@the_dahiya_boy 的回答:

  1. 你得到带有特定字段的JSON字段(可以有一两个字段需要显示在紫色字段中)

  2. 你检查有多少字段

  3. 如果只有一个字段,那么您可以将第二个视图的框架(第二个字段为空)设置为 0

【讨论】:

    【解决方案4】:

    正如 Bista 先生所说,StackView 有一个选项。

    1. 使用设计在 Storyboard 中创建自定义单元格。
    2. 使用堆栈视图代替添加多个标签。
    3. 在代码中使用自定尺寸单元格。你可以参考这个网站来指导你。 APPCode self sizing cells 或者只是在 stackoverflow 上寻找。

    我现在没有自己测试它,但我认为使用 stackView 和自调整单元格可能会很棘手。由于每个单元格可以根据 StackView 的内容具有不同的高度。因此,百分百确定,您始终可以计算单元格的高度。

    1. 根据json内容改变stack view的内容。 (紫色标签的记录数)

    您还可以查看堆栈中的类似问题。 请参阅此链接,那里有可能为您提供答案。 Multiple UILabels inside a self sizing UITableViewCell

    【讨论】:

    • 如何在 iOS 8.0 中执行此操作,因为堆栈视图在少于 9 个版本的 iOS 中不可用
    • 因此,如果您使用的是 1. 将子视图添加到单元格(标准 UIView),为其添加高度约束。 2. 根据 json 文件中紫色单元格记录的数量计算该子视图的高度 3. 从步骤 1 4 修改该视图的高度约束。 在代码中生成标签并将它们添加为子视图以从步骤 1 中查看。@SaiPavanParanam
    【解决方案5】:

    您可以结合使用水平和垂直堆栈视图来实现此目的:

    此解决方案可让您避免使用上面建议的其他方法的两个陷阱:

    • 您不必弄乱切换视图的隐藏属性
    • 您不限于固定的最大项目数

    代码如下:

    import UIKit
    
    class Order {
        var stations = [Station]()
        var companies = [String]()
    }
    class Station {
        let name: String
        let amount: Int
        init(name: String, amount: Int) {
            self.name = name
            self.amount = amount
        }
    }
    
    class TableViewController: UITableViewController {
    
        var orders = [Order]()
    
        override func viewDidLoad() {
        super.viewDidLoad()
    
        tableView!.rowHeight = UITableViewAutomaticDimension
        tableView!.estimatedRowHeight = 44.0
    
        //simulated data
        let order1 = Order()
        order1.companies.append("Global @ CITGO Braintree, Braintree")
        order1.companies.append("Exxon @ Global, Chelsea")
        order1.stations.append(Station(name: "Tyngsboro Mobil #2871", amount: 4000))
        order1.stations.append(Station(name: "Grafton St #10095", amount: 15000))
        orders.append(order1)
    
        let order2 = Order()
        order2.companies.append("Exxon @ Global, Chelsea")
        order2.stations.append(Station(name: "Winstead Citgo #2001", amount: 3000))
        orders.append(order2)
    
        let order3 = Order()
        order3.companies.append("MSCG @ Sunoco Partners")
        order3.stations.append(Station(name: "Citgo #123", amount: 7000))
        order3.stations.append(Station(name: "Mobil #345", amount: 12500))
        order3.stations.append(Station(name: "Exxon #567", amount: 300))
        order3.stations.append(Station(name: "Citgo #789", amount: 6100))
        order3.stations.append(Station(name: "Stoughton Mobil #2744", amount: 9098))
        order3.stations.append(Station(name: "Westborough Mobil #2720", amount: 120000))
        orders.append(order3)
    }
    
    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return orders.count
    }
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
        let cell = tableView.dequeueReusableCell(withIdentifier: "MyTableViewCell", for: indexPath) as! TableViewCell
    
        let order = orders[indexPath.row]
    
        cell.companyLabel.text = ""
        for (index, company) in order.companies.enumerated() {
            cell.companyLabel.text! += company
            if index < order.companies.count - 1 {
                cell.companyLabel.text! += "\n"
            }
        }
    
        for station in order.stations {
    
            // create horizontal stack view to arrange the station name and amount
            let horizontalStackView = UIStackView()
            horizontalStackView.axis = .horizontal
    
            let nameLabel = UILabel()
            nameLabel.translatesAutoresizingMaskIntoConstraints = false
            nameLabel.text = station.name
            horizontalStackView.addArrangedSubview(nameLabel)
    
            let amountLabel = UILabel()
            amountLabel.translatesAutoresizingMaskIntoConstraints = false
            amountLabel.addConstraint(NSLayoutConstraint(item: amountLabel, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .width, multiplier: 1.0, constant: 60))
            amountLabel.backgroundColor = UIColor.purple
            amountLabel.textAlignment = .right
            amountLabel.textColor = UIColor.white
            amountLabel.text = String(station.amount)
            horizontalStackView.addArrangedSubview(amountLabel)
    
            // add the horizontal stack view to the vertical stack view containing all stations
            cell.stackView.addArrangedSubview(horizontalStackView)
        }
    
        return cell
    }
    

    }

    故事板如下所示:

    【讨论】:

    • 但是如果站点名称超过两行,您的代码不会失败...数字会再次正确对齐吗??
    • 尝试将代码复制到示例项目中。我这样做是为了让您可以轻松更改示例数据并查看会发生什么。您可以使用 UIStackView 的间距属性在紫色标签之间添加空间。显然,您必须自己做一些工作才能获得与模型完全相同的样式,但我已经向您展示了如何在单元格中重复标签。祝你好运!
    • 太好了,如果它对你有用,你会接受这个答案吗?谢谢。
    • 是的......当然......但让我先试试
    • 能否请您发送您的项目文件
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多