当我尝试在 iOS 14 上更新我的 collectionView 布局时出现此错误:
*** 由于未捕获的异常 'NSInvalidArgumentException' 而终止应用程序,原因:'*** -[__NSDictionaryM setObject:forKey:]: object cannot be nil (key:
但是它在 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
}
}
我什至尝试在这里设置断点,但没有成功。
您能否提供更多信息,例如您的其他布局集成了哪些类?现有信息很难定位响应问题,只有nil
值导致崩溃