当我尝试在 iOS 14.1 上使用 collectionView.setCollectionViewLayout 方法更新我的 collectionViewLayout 但在 iOS 16 上运行良好

问题描述 投票:0回答:1

当我尝试在 iOS 14 上更新我的 collectionView 布局时出现此错误: *** 由于未捕获的异常 'NSInvalidArgumentException' 而终止应用程序,原因:'*** -[__NSDictionaryM setObject:forKey:]: object cannot be nil (key: {length = 2, path = 0 - 0})'

但是它在 iOS 16 上绝对可以正常工作!即使在另一个视图控制器上,它也适用于 iOS 14。

collectionView.setCollectionViewLayout(mode.layout, animated: false)

extension ItemsViewMode {
    var layout: UICollectionViewFlowLayout {
        switch self {
        case .card:
            return OfferingCardLayout()
        case .investmentCard:
            return InvestmentsCardLayout()
        case .list:
            return OfferingListLayout()
        case .investmentList:
            return InvestmentsListLayout()
        }
    }
  }
class InvestmentsListLayout: OfferingListLayout {
    private enum Const {
        static let itemHeight: CGFloat = 164
        static let minimumLineSpacing: CGFloat = 16
    }

    override init() {
        super.init()
        itemHeight = Const.itemHeight
        minimumLineSpacing = Const.minimumLineSpacing
    }
}

class OfferingListLayout: UICollectionViewFlowLayout {
    private enum Const {
        static let minimumInteritemSpacing: CGFloat = 0
        static let minimumLineSpacing: CGFloat = 2
        static let leftRightSpacing: CGFloat = 8
        static let itemHeight: CGFloat = 216
    }

    var itemHeight: CGFloat = Const.itemHeight

    override init() {
        super.init()
        register(SeparatorView.self, forDecorationViewOfKind: "separator")
        scrollDirection = .vertical
        minimumInteritemSpacing = Const.minimumInteritemSpacing
        minimumLineSpacing = Const.minimumLineSpacing
        footerReferenceSize = CGSize(width: 50, height: 50)
    }

    @available(*, unavailable)
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func prepare() {
        guard let collectionView = collectionView, collectionView.numberOfSections > 0 else { return }

        itemSize = CGSize(width: collectionView.frame.width - Const.leftRightSpacing * 2, height: itemHeight)
        super.prepare()
    }

    override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool {
        true
    }

    override func invalidationContext(forBoundsChange newBounds: CGRect) -> UICollectionViewLayoutInvalidationContext {
        guard let context = super.invalidationContext(forBoundsChange: newBounds) as? UICollectionViewFlowLayoutInvalidationContext else {
            return UICollectionViewLayoutInvalidationContext()
        }
        context.invalidateFlowLayoutDelegateMetrics = newBounds.size != collectionView?.bounds.size
        return context
    }

    override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes] {
        let layoutAttributes = super.layoutAttributesForElements(in: rect) ?? []
        let lineWidth: CGFloat = Const.minimumLineSpacing
        var decorationAttributes: [UICollectionViewLayoutAttributes] = []

        // skip first cell
        for layoutAttribute in layoutAttributes where layoutAttribute.indexPath.item > 0 {
            let separatorAttribute = UICollectionViewLayoutAttributes(forDecorationViewOfKind: "separator", with: layoutAttribute.indexPath)
            let cellFrame = layoutAttribute.frame
            separatorAttribute.frame = CGRect(x: cellFrame.origin.x, y: cellFrame.origin.y - lineWidth, width: cellFrame.size.width, height: lineWidth)
            separatorAttribute.zIndex = Int.max
            decorationAttributes.append(separatorAttribute)
        }

        return layoutAttributes + decorationAttributes
    }
}

我什至尝试在这里设置断点,但没有成功。

ios swift uicollectionview ios14
1个回答
0
投票

您能否提供更多信息,例如您的其他布局集成了哪些类?现有信息很难定位响应问题,只有nil

值导致崩溃
© www.soinside.com 2019 - 2024. All rights reserved.