在没有情节提要的情况下在 UIView 中添加 UICollectionView
Adding UICollectionView inside UIView without Storyboards
我已经 ViewController 使用 UITablewView 调用了 myVC - myTable.
我想要的是添加一些 UIView 作为 myTable 的 headerView from code。所以在 myVC 的 viewDidLoad() 方法中,我添加了这段代码
let topView = TopView()
topView.frame.size.height = 100
topView.frame.size.width = myTable.frame.width
myTable.tableHeaderView = featuredEventsView
我还创建了名为 TopView.swift 的文件,看起来像
class TopView : UIView {
override init(frame: CGRect) {
super.init(frame: frame)
self.backgroundColor = .red
}
required init?(coder aDecoder: NSCoder) {.....}
}
它正在正常工作。我在 myTable.
的 headerView 中看到红色的 UIView
现在我想在 topView 中添加 UICollectionView,但我在这里遇到了问题。我正在尝试做类似
的事情
class TopView : UIView, UICollectionViewDataSource, UICollectionViewDelegate {
override init(frame: CGRect) {
super.init(frame: frame)
self.backgroundColor = .red
addSubview(myCollectionView)
}
required init?(coder aDecoder: NSCoder) {.....}
let myCollectionView : UICollectionView = {
let cv = UICollectionView()
cv.translatesAutoresizingMaskIntoConstraints = false
cv.delegate = self as! UICollectionViewDelegate
cv.dataSource = self as! UICollectionViewDataSource
cv.backgroundColor = .yellow
return cv
}()
}
我还创建了 UICollectionViewDataSource 所需的函数,但应用程序在构建后崩溃。我做错了什么?
你有两个问题:
1) 您错误地初始化了 UICollectionView,因为您必须给它一个布局。你需要这样的东西(使用你想要的任何框架,但如果你打算继续使用自动布局没关系):
let layout = UICollectionViewFlowLayout()
let cv = UICollectionView(frame: CGRect.zero, collectionViewLayout: layout)
2) 在初始化 属性 时,不能在闭包内引用 'self'。这是因为 if 可能尚未初始化(如本例),因此您不能保证使用它是安全的。
我认为如果你像这样使用惰性初始化应该没问题(而且你甚至不需要强制转换 'self'):
lazy var myCollectionView : UICollectionView = {
let layout = UICollectionViewFlowLayout()
let cv = UICollectionView(frame: CGRect.zero, collectionViewLayout: layout)
cv.translatesAutoresizingMaskIntoConstraints = false
cv.delegate = self
cv.dataSource = self
cv.backgroundColor = .yellow
return cv
}()
使用惰性方法应该延迟到 self 被初始化,因此可以安全使用。
我已经 ViewController 使用 UITablewView 调用了 myVC - myTable.
我想要的是添加一些 UIView 作为 myTable 的 headerView from code。所以在 myVC 的 viewDidLoad() 方法中,我添加了这段代码
let topView = TopView()
topView.frame.size.height = 100
topView.frame.size.width = myTable.frame.width
myTable.tableHeaderView = featuredEventsView
我还创建了名为 TopView.swift 的文件,看起来像
class TopView : UIView {
override init(frame: CGRect) {
super.init(frame: frame)
self.backgroundColor = .red
}
required init?(coder aDecoder: NSCoder) {.....}
}
它正在正常工作。我在 myTable.
的 headerView 中看到红色的 UIView现在我想在 topView 中添加 UICollectionView,但我在这里遇到了问题。我正在尝试做类似
的事情class TopView : UIView, UICollectionViewDataSource, UICollectionViewDelegate {
override init(frame: CGRect) {
super.init(frame: frame)
self.backgroundColor = .red
addSubview(myCollectionView)
}
required init?(coder aDecoder: NSCoder) {.....}
let myCollectionView : UICollectionView = {
let cv = UICollectionView()
cv.translatesAutoresizingMaskIntoConstraints = false
cv.delegate = self as! UICollectionViewDelegate
cv.dataSource = self as! UICollectionViewDataSource
cv.backgroundColor = .yellow
return cv
}()
}
我还创建了 UICollectionViewDataSource 所需的函数,但应用程序在构建后崩溃。我做错了什么?
你有两个问题:
1) 您错误地初始化了 UICollectionView,因为您必须给它一个布局。你需要这样的东西(使用你想要的任何框架,但如果你打算继续使用自动布局没关系):
let layout = UICollectionViewFlowLayout()
let cv = UICollectionView(frame: CGRect.zero, collectionViewLayout: layout)
2) 在初始化 属性 时,不能在闭包内引用 'self'。这是因为 if 可能尚未初始化(如本例),因此您不能保证使用它是安全的。
我认为如果你像这样使用惰性初始化应该没问题(而且你甚至不需要强制转换 'self'):
lazy var myCollectionView : UICollectionView = {
let layout = UICollectionViewFlowLayout()
let cv = UICollectionView(frame: CGRect.zero, collectionViewLayout: layout)
cv.translatesAutoresizingMaskIntoConstraints = false
cv.delegate = self
cv.dataSource = self
cv.backgroundColor = .yellow
return cv
}()
使用惰性方法应该延迟到 self 被初始化,因此可以安全使用。