如何在通过 UITableViewCell 中的 XIB 加载的子视图中对标签和 UILabels/UIImageViews 进行初始样式设置

Posted

技术标签:

【中文标题】如何在通过 UITableViewCell 中的 XIB 加载的子视图中对标签和 UILabels/UIImageViews 进行初始样式设置【英文标题】:How to do initial styling of labels and UILabels/UIImageViews in a sub view which is loaded via an XIB in a UITableViewCell 【发布时间】:2017-05-24 16:05:39 【问题描述】:

我有一个 UITableViewCell,它有一个包含标签的子视图(在其内容视图内)、一个图像视图和我需要设置的其他属性。

此子视图是从 XIB 设置的,因为它在应用程序的其他地方使用。我正在使用

将其加载到单元格中
private func setup() 
    let nib = UINib.init(nibName: "AuthorHeaderView", bundle: nil)
    if let view = nib.instantiate(withOwner: self, options: nil).first as? UIView 

        view.translatesAutoresizingMaskIntoConstraints = false
        self.addSubview(view)

        view.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true
        view.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true
        view.topAnchor.constraint(equalTo: topAnchor).isActive = true
        view.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true
    

然后,当加载单元格时,我在awakeFromNib() 中设置一些默认值。当我在那里有一个断点时,我可以看到 headerView: AuthorHeaderView 已加载到内存中并且设置正确,但是它的标签和 imageView 没有,它们是 nil,因此在尝试设置这些视图的样式时它会崩溃.

如何在通过 XIB 加载的子视图中对标签和图像视图以及所有内容进行初始样式设置?

【问题讨论】:

【参考方案1】:

好的,所以我找到了解决方案。问题是我没有添加init(coder aDecoder: NSCoder)

我有一个从 awakeFromNib 调用的设置方法,但我还需要从 initWithCoder 调用它。

例子:

override func awakeFromNib() 
    super.awakeFromNib()

    setup()


required init?(coder aDecoder: NSCoder) 
    super.init(coder: aDecoder)

    setup()


private func setup() 
    let nib = UINib.init(nibName: "HeaderView", bundle: nil)
    if let view = nib.instantiate(withOwner: self, options: nil).first as? UIView 

        view.translatesAutoresizingMaskIntoConstraints = false
        self.addSubview(view)

        view.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true
        view.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true
        view.topAnchor.constraint(equalTo: topAnchor).isActive = true
        view.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true
    

无论如何,现在它可以完美运行了。希望这可以在某个阶段对其他人有所帮助:-)

【讨论】:

以上是关于如何在通过 UITableViewCell 中的 XIB 加载的子视图中对标签和 UILabels/UIImageViews 进行初始样式设置的主要内容,如果未能解决你的问题,请参考以下文章

如何向 UITableViewCell 添加手势?

如何在 UITableViewCell 中设置 UIButton 状态?

如何根据 UITableViewCell 中的内容调整水平 UICollectionView 的高度

在 iOS 中访问自定义 UITableViewCell 中的视图

iOS Swift 如何更改或更新自定义 UITableViewCell 中的 UILabel 属性

“自上而下” UITableView 中的 UITableViewCell 中的多个按钮