自定义 UICollectionCell 的 nil 标签 [英] nil label for custom UICollectionCell
问题描述
编辑:似乎与这个问题相同
我使用自定义布局和单元格制作了集合视图,但我的单元格的位置有点偏离,所以我决定给它们编号,以便我可以更轻松地调试它.我跟着这个人的answer使用标签为我的单元格编号.不知何故 myLabel
为零并导致我的应用程序崩溃.
EDIT: seems like same question as this
I made collection view with custom layout and cell but my cell's positions were a little off so I decided to number them so that I could debug it easier. I followed this guy's answer to number my cell using labels. Somehow myLabel
was nil and caused my app to crash.
我相信我已经正确连接了插座,但也许有人可以提供一个列表让我检查我是否做错了什么.
I believe I have connected the outlets correctly but maybe someone could provide a list for me to check if I am doing anything wrong.
import UIKit
class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {
@IBOutlet var gridView: UICollectionView!
private let reuseIdentifier = "DesignCell"
private let numberOfSections = 1
private let numberOfCircles = 48
override func viewDidLoad() {
super.viewDidLoad()
self.gridView.registerClass(MyCell.self, forCellWithReuseIdentifier: reuseIdentifier)
}
func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
return numberOfSections
}
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return numberOfCircles
}
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! MyCell
cell.myLabel.text = String(indexPath.item) // myLabel is nil and causes a crash
return cell
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
GridLayout(我的自定义布局)
import UIKit
import Darwin
class GridLayout: UICollectionViewLayout {
private let numberOfColumns = 12
private let numberOfRows = 4
private var cache = [UICollectionViewLayoutAttributes]()
private var contentHeight: CGFloat = 0
private var contentWidth: CGFloat {
let insets = collectionView!.contentInset
return CGRectGetWidth(collectionView!.bounds) - insets.left - insets.right
}
override func prepareLayout() {
// some calculation i did for my cells
}
override func collectionViewContentSize() -> CGSize {
return CGSize(width: contentWidth, height: contentHeight)
}
override func layoutAttributesForElementsInRect(rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
var layoutAttributes = [UICollectionViewLayoutAttributes]()
for attr in cache {
if CGRectIntersectsRect(attr.frame, rect) {
layoutAttributes.append(attr)
}
}
return layoutAttributes
}
}
我的细胞
import UIKit
class MyCell : UICollectionViewCell {
@IBOutlet weak var myLabel: UILabel!
}
推荐答案
尝试在 ViewController 类中的 viewDidLoad() 中删除这一行:
Try to remove this line within viewDidLoad() in your ViewController class:
self.gridView.registerClass(MyCell.self, forCellWithReuseIdentifier: reuseIdentifier)
不需要它,因为您已经在 Storyboard 中创建了 UICollectionView,连接到您的数据源和委托,并且您已经添加了所有必需的方法:
It's not needed since you have created your UICollectionView in Storyboard, connected to your dataSource and delegate, and you have added all the required methods:
- numberOfItemsInSection
- cellForItemAtIndexPath
这篇关于自定义 UICollectionCell 的 nil 标签的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!