【问题标题】:nil label for custom UICollectionCell自定义 UICollectionCell 的 nil 标签
【发布时间】:2016-02-06 09:44:24
【问题描述】:

编辑:似乎与this的问题相同
我用自定义布局和单元格制作了集合视图,但我的单元格的位置有点偏,所以我决定给它们编号,以便我可以更轻松地调试它。我跟着这个人的answer 使用标签为我的单元格编号。不知何故,myLabel 为 nil,导致我的应用程序崩溃。

我相信我已经正确连接了插座,但也许有人可以提供一份清单让我检查我是否做错了什么。

视图控制器

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!

}

【问题讨论】:

    标签: ios swift uicollectionview uicollectionviewcell uicollectionviewlayout


    【解决方案1】:

    尝试在 ViewController 类的 viewDidLoad() 中删除这一行:

    self.gridView.registerClass(MyCell.self, forCellWithReuseIdentifier: reuseIdentifier)
    

    不需要,因为您已经在 Storyboard 中创建了 UICollectionView,连接到您的数据源和委托,并且您已经添加了所有必需的方法:

    • numberOfItemsInSection
    • cellForItemAtIndexPath

    【讨论】:

    • 它有效,但我有点困惑。为什么再次注册课程会导致这个问题?
    • link。如果您的 collectionView 单元格是使用 nib 创建的,请使用 registerNib:如果它是用代码编写的,请使用 registerClass:
    猜你喜欢
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    • 2015-07-25
    • 2015-05-19
    • 1970-01-01
    • 2012-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多