如何以编程方式在 TableView 单元中添加多个 UIImageView

Posted

技术标签:

【中文标题】如何以编程方式在 TableView 单元中添加多个 UIImageView【英文标题】:How to add multiple UIImageView in a TableView Cell programmatically 【发布时间】:2017-09-21 17:02:06 【问题描述】:

我正在尝试在单个 Tableview 单元格中添加 3 个标签和 3 个图像。 这是我的标签和图像视图

let Namelbl:UILabel=
        let label=UILabel()
        label.text="item"
        label.translatesAutoresizingMaskIntoConstraints = false
        return label

    ()
    let Namelbl2:UILabel=
        let label2=UILabel()
        label2.text="item"
        label2.translatesAutoresizingMaskIntoConstraints = false
        return label2

    ()
    let Namelbl3:UILabel=
        let label3=UILabel()
        label3.text="item"
        label3.translatesAutoresizingMaskIntoConstraints = false
        return label3

    ()
    let image1: UIImageView = 
        let theImageView1 = UIImageView()
        theImageView1.image = UIImage(named: "Masjid")
        theImageView1.translatesAutoresizingMaskIntoConstraints = false
        return theImageView1
    ()
    let image2: UIImageView = 
        let theImageView2 = UIImageView()
        theImageView2.image = UIImage(named: "Masjid2")
        theImageView2.translatesAutoresizingMaskIntoConstraints = false
        return theImageView2
    ()
    let image3: UIImageView = 
        let theImageView3 = UIImageView()
        theImageView3.image = UIImage(named: "Masjid3")
        theImageView3.translatesAutoresizingMaskIntoConstraints = false
        return theImageView3
    ()

这是我用约束设置视图的函数

func setupViews()
    addSubview(Namelbl)
    addSubview(Namelbl2)
    addSubview(Namelbl3)
    addSubview(image1)
    addSubview(image2)
    addSubview(image3)
        addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-16-[v0]-16-[v1]-16-[v2]-16-[v3]-16-[v4]-16-[v5]-50-|",options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": Namelbl,"v1":Namelbl2,"v2":Namelbl3,"v3":image1,"v4":image2,"v5":image3]))
        addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[v0]|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": Namelbl]))
        addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[v0]|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": Namelbl2]))
         addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[v0]|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": Namelbl3]))
        addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[v0]|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": image1]))

        addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[v0]|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": image2]))
        addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[v0]|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": image3]))


    

问题是这适用于 3 个标签和一张图片,它不显示其他两张图片

【问题讨论】:

确切问题是什么? “不显示”其他两个图像有点模糊。例如,您是否设置了断点并确定image2image3 不为零?您是否收到任何控制台反馈? 是的,我已经做到了 image2 & image3 不是 nil。 这些元素的宽度是多少?似乎没有设置。 【参考方案1】:

我建议不要在代码 (*) 中向您的单元格添加视图。我建议设置您的表格视图以使用自定义单元格模板。然后,您可以自定义 UITableViewCell 的一个或多个子类,并使用链接到您的图像视图的插座,当您使用特定标识符将单元格出列时,您将获得一个正确类的单元格,其中插座链接并准备好设置。您所要做的就是将其转换为正确的类型,然后配置它的视图。

(*) 在代码中向单元格添加视图需要更多的工作,而且还需要特殊处理。如果您不小心,那么每次将单元格出列时,您都会添加另一组视图。当您修复该问题时,您需要一些机制来访问您在最初创建单元格时添加的视图,而使用 viewWithTag(_:) 等典型方法很脆弱。

【讨论】:

其实我是把所有的东西都编程化了,和故事板没有任何关系:) 这是不明智的。 你是对的,但这是我的任务:( 为什么这是不明智的?故事板可以协助 UI 开发,但最终它们不能做任何你不能通过代码做的事情。这就像学习命令行与 GUI(无论是 Assembler v. COBOL 还是 .Net framework v. VS)。我在想你在说一些我没有得到或看到的东西。在 OP 的代码中,我同意 - 使用带有图像视图的模板(并且可能正确填充它们的数组),正确地针对提供的覆盖进行代码。 @dfd,Assembler vs. Swift 是一个更好的类比。诚然,您可以使用 Assembler 完成所有可以在 Swift 中执行的操作,但我不会聘请坚持使用 assembler 创建 ios 应用程序的开发人员。同样,我不会聘请拒绝使用 Storyboard 并坚持用代码创建 UI 的 iOS 开发人员。前期工作更多,更难遵循,也更难维护。

以上是关于如何以编程方式在 TableView 单元中添加多个 UIImageView的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式在 TableView 单元中添加多个 UIImageView

如何使用 tableView.dequeueReusableCell 以编程方式将单元格样式添加到单元格?

如何以编程方式将不同单元格的不同图像添加到 tableView (Swift)

如果一切都是以编程方式创建而不使用情节提要,如何以编程方式调整 TableView 中单元格的高度?

如何以编程方式将不同单元格的不同图像添加到 tableView (Swift 3)

如何以编程方式将约束添加到 tableView 单元格的默认 textLabel 和 accessoryView