我正在尝试为我的collectionviewcells添加约束。但是当我在其类中使用此代码时,我得到一个控制台错误
class IndexD: UICollectionViewCell {
func contstraints() {
addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[v0]|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": IndexD.self]))
}
}
我收到的错误是:
无法识别的选择器已发送至课程
我不知道如何更改我的代码以删除任何错误。我的目标是为每个特定的集合视图单元设置约束。
答案 0 :(得分:1)
在views
字典中,您传递的视图v0
的值不正确。你应该使用self
引用类的当前实例而不是引用类本身的IndexD.self
。
将您的views
更改为:
views: ["v0": self]
还有其他问题。您正在将生成的约束添加到self
,但是需要将它们添加到视图层次结构中的较高项目。 "H:|[v0]|"
会生成涉及superview
self
的约束,因此您确实需要执行superview?.addConstraints(...
。
从iOS 8开始,有一种更简单的激活约束的方法。您可以将isActive
属性设置为true
,它们会自动添加到正确的视图中。如果要激活多个约束,则可以使用约束数组调用NSLayoutContraint.activate()
,iOS将激活所有约束。
如果您没有NSLayoutFormatOptions
,请传递[]
。并且,由于这是该参数的默认值,因此您可以完全退出options: []
。
因此,考虑到所有这些因素,以下是您的代码的更正版本:
func contstraints() {
NSLayoutConstraint.activate(NSLayoutConstraint.constraints(withVisualFormat: "H:|[v0]|", metrics: nil, views: ["v0": self]))
}
答案 1 :(得分:0)
首先,如果你没有导入UIKit,你应该。并且您需要初始化该类,以便CollectionCell知道执行函数的位置。你的代码应该是这样的..
import UIKit
class IndexD: UICollectionViewCell {
override init(frame: CGRect) {
super.init(frame: frame)
addContstraints()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func addContstraints() {
addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[v0]|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": IndexD.self]))
}
我更改了您的方法名称,因为当您尝试在重写init中执行它时,Swift将您的方法称为[NsLayoutConstraints]并且会混淆。