两个表视图到一个视图控制器中?

Posted

技术标签:

【中文标题】两个表视图到一个视图控制器中?【英文标题】:Two table views into a single View Controller? 【发布时间】:2020-04-26 20:05:25 【问题描述】:

我想创建一个新部分但没有 imageView,我需要做什么?因为如果我让字符串为空(不接受 nil),titleLabel 将与第一部分中的 titleLabel 对齐。我想让第二部分的标题从左对齐 20(没有图像) 我是否必须为我想要的没有图像的部分创建另一个模型? 我可以在 cellForRowAt 中添加一个没有图像的新部分吗??

fileprivate var CELL_ID = "CELL_ID"


fileprivate var aerealCell: [[AerealCellModel]] = [
    [
        AerealCellModel(image: "aereal_icon", title: "Aereal", arrow: "chevron.right")
    ],
    [
        AerealCellModel(image: " ", title: "Indice de Masa Corporal", arrow: "chevron.right"),
        AerealCellModel(image: " ", title: "Clasificación ASA", arrow: "chevron.right"),
        AerealCellModel(image: " ", title: "Riesgo Cardiaco de Gupta", arrow: "chevron.right"),
        AerealCellModel(image: " ", title: "Escala de Riesgo de Lee", arrow: "chevron.right"),
        AerealCellModel(image: " ", title: "Peso Ideal", arrow: "chevron.right"),
        AerealCellModel(image: " ", title: "Tamaño de Tubo Pediátrico", arrow: "chevron.right"),
        AerealCellModel(image: " ", title: "Clasificacion de Mallampati", arrow: "chevron.right")
    ]

]

override func viewDidLoad() 
    super.viewDidLoad()
    view.backgroundColor  = .systemBackground

    navigationController?.navigationBar.prefersLargeTitles  = true
    setupTableView()



fileprivate func setupTableView() 
    tableView.register(AerealCell.self, forCellReuseIdentifier: CELL_ID)




override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    tableView.deselectRow(at: indexPath, animated: true)



override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    return aerealCell[section].count



override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 
    return 54



override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: CELL_ID, for: indexPath) as! AerealCell
    let aerealMainCell = aerealCell[indexPath.section][indexPath.row]


    cell.aerealCalcCell = aerealMainCell
    return cell



override func numberOfSections(in tableView: UITableView) -> Int 
    return aerealCell.count



override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? 
    let view = UIView()
    let label = UILabel()
    label.text = section == 0 ? "CALCULADORA PRINCIPAL" : "OTRAS CALCULADORAS  ????  (Premium Members)"
    label.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(label)
    label.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20).isActive = true
    label.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20).isActive = true
    label.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -5).isActive = true
    label.heightAnchor.constraint(equalToConstant: 30).isActive = true
    label.numberOfLines = 1
    label.adjustsFontSizeToFitWidth = true
    view.backgroundColor = .systemGray6
    label.font = UIFont.systemFont(ofSize: 14, weight: .light)

    return view


override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat 
    return 54

【问题讨论】:

您可以创建和使用两个不同的单元格 【参考方案1】:

方法 1:将您的 UI 元素放置在水平 stackView 中

您可以在水平 stackView 中添加 imageViewtitleLabel 并对其应用约束。当没有 imageContent 时,标签会自行调整到起始位置,因为imageView 没有 widthAnchor。这是一个更简单的方法

方法 2:如果您不想在 StackView 中放置元素

删除与titleLabel 关联的任何尾随锚点/约束。只需添加相对于您的 imageView 的前导约束,并且不要向其添加任何 widthAnchor。

当没有 imageView 内容时,titleLabel 将自己对齐到 imageView 起始位置(imageView 宽度将为 0

【讨论】:

我认为这些选项不是一个选项。 imageView 是模型中的 String 类型,每当我将 "" 留空时,对于缺少的图像,约束将保持不变。所以我卡住了。 ?【参考方案2】:
    为单元格中的图像视图设置宽度约束。 当您不想显示图像时,将图像宽度限制设置为 0。

【讨论】:

以上是关于两个表视图到一个视图控制器中?的主要内容,如果未能解决你的问题,请参考以下文章

一个视图控制器中的两个表视图 swift

IOS - 从表视图控制器获取值并将其发送到另一个表视图控制器

一个视图控制器中的两个表视图,快速

swift2.0中的didSelectRowAtIndexPath在一个视图控制器中的两个表视图

当我将核心数据添加到表视图时,我的应用程序崩溃了

为同一视图控制器中的两个表实现单个“numberOfRowsInSection”方法