所以我改变了这个:
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
return CGSizeMake(view.frame.width/2, 40)
}
到此:
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier(collectionViewCellId, forIndexPath: indexPath) as! CollectionViewCell
return CGSizeMake(view.frame.width/2, 40)
}
由于某种原因它崩溃了。我甚至没有使用常量,但崩溃令人困惑。
完整错误:由于未捕获的异常'NSRangeException'而终止应用程序,原因:'*** - [__ NSArrayM objectAtIndex:]:索引1超出边界[0 .. 0]'
我的目标是使细胞的宽度与标签的宽度相同+ 5
cell.label.frame.width + 5
答案 0 :(得分:1)
原因可能是您发布了不正确的单元格标识符,并且此类标识符的索引路径此类单元格不存在,请检查您的单元格标识符,其他部分代码应该可以正常工作。
答案 1 :(得分:0)
就我而言,此问题将在iOS11系列系统中发生,而在更高版本中则不会发生。
很明显,在调用委托人collectionView.dequeueReusableCellWithReuseIdentifier(
中的sizeForItemAtIndexPath
时,它在不同的系统版本中会有所不同。
也就是说,我想我们不能提前使用dequeueReusableCellWithReuseIdentifier(
,因为对于iOS11系列,collectionView
实例当时可能没有任何已注册的单元格。
最简单的解决方案是,我们应该直接创建一个单元格实例,而不要使用dequeueReusableCellWithReuseIdentifier
来计算单元格的大小。
我使用的是
static func calcCellHeight(collectionView: UICollectionView, index: IndexPath, cellVm: YLMultiplePostsAboutMeCellViewModel) -> CGFloat {
var height: CGFloat = 0
let rect = CGRect(x: 0, y: 0, width: collectionView.frame.width, height: 0)
let cell = YLMultiplePostsAboutMeCell(frame: rect)
cell.configCell(cellVm: cellVm)
height = cell.contentView.systemLayoutSizeFitting(CGSize(width: collectionView.frame.width, height: CGFloat.infinity)).height
return height
}
希望这会有所帮助。
答案 2 :(得分:-4)
你有一个错误。有些东西没有按预期的那样起作用。如果您坚持认为该错误在您发布的代码中,并且您发布的代码是正确的,那么您将永远不会发现您生活中的问题。
发生了崩溃。规则1:崩溃是你的错误。 您的代码错误。你的任务是找出哪些代码是错误的。
规则2:崩溃并不关心你打算做什么。你说“我的目标是使单元格的宽度与标签的宽度相同+ 5”。 iOS正在嘲笑这一点。它告诉你问题是什么:当数组只有一个元素时,你正在索引1访问一个数组。它没有没有与你认为你的问题有什么关系。
规则3:阅读错误消息并理解它。忘掉你认为应该发生什么,因为它没有发生。错误消息告诉你实情。
设置异常断点(谷歌搜索“Xcode断点异常”,更好:学会使用你的工具)。当它发生时,跟随堆栈跟踪找到导致它的代码。