因未捕获的异常'NSRangeException'而终止应用

时间:2016-06-29 20:34:22

标签: ios swift

所以我改变了这个:

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

3 个答案:

答案 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断点异常”,更好:学会使用你的工具)。当它发生时,跟随堆栈跟踪找到导致它的代码。