此代码曾用于swift 2.3及更早版本。但是当我在Swift 3中更新它时,应用程序崩溃了。
这是swift 2.3中的代码
override func layoutAttributesForElementsInRect(rect: CGRect) -> [UICollectionViewLayoutAttributes]?
{
var layoutAttributes = [UICollectionViewLayoutAttributes]()
layoutInfo?.enumerateKeysAndObjectsUsingBlock({ (object: AnyObject, elementInfo: AnyObject, stop: UnsafeMutablePointer<ObjCBool>) -> Void in
let infoDic = elementInfo as! NSDictionary as NSDictionary!
infoDic.enumerateKeysAndObjectsUsingBlock( { (object: AnyObject!, attributes: AnyObject!, stop: UnsafeMutablePointer<ObjCBool>) -> Void in
let attr = attributes as! UICollectionViewLayoutAttributes
if (CGRectIntersectsRect(rect, attributes.frame))
{
layoutAttributes.append(attr)
}
})
})
return layoutAttributes
}
这是Swift 3的更新版本
override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
var layoutAttributes = [UICollectionViewLayoutAttributes]()
layoutInfo?.enumerateKeysAndObjects({ (object: AnyObject, elementInfo: AnyObject, stop: UnsafeMutablePointer<ObjCBool>) -> Void in
let infoDic = elementInfo as! NSDictionary as NSDictionary!
infoDic?.enumerateKeysAndObjects( { (object: AnyObject!, attributes: AnyObject!, stop: UnsafeMutablePointer<ObjCBool>) -> Void in
let attr = attributes as! UICollectionViewLayoutAttributes
if (rect.intersects(attributes.frame))
{
layoutAttributes.append(attr)
}
} as! (Any, Any, UnsafeMutablePointer<ObjCBool>) -> Void)
} as! (Any, Any, UnsafeMutablePointer<ObjCBool>) -> Void)
return layoutAttributes
}
我正在崩溃}}! (Any,Any,UnsafeMutablePointer) - &gt;无效)EXC_BREAKPOINT
任何人都可以帮助我?
这是我从这个家伙那里得到的项目。 https://github.com/CoderXpert/EPGGrid
答案 0 :(得分:1)
我认为你已经设法以某种方式将自己与这个话题捆绑在一起。 (如果我最终在Swift代码中使用了大量的转换和ObjectiveC类型,那对我来说总是一个警示标志)。我刚看了一下我的一个应用程序中的layoutAttributesForElements(in)的实现,它归结为以下几点:
override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
var layoutAttributes = [UICollectionViewLayoutAttributes]()
if cache.isEmpty {
self.prepare()
}
for attributes in cache {
if attributes.frame.intersects(rect) {
layoutAttributes.append(self.layoutAttributesForItem(at: attributes.indexPath)!)
}
}
return layoutAttributes
}
在此实现中,cache是UICollectionViewLayoutAttributes的数组,在初始化集合视图或数据更改时(通过prepare()方法)准备。确保缓存非空后,您需要做的就是遍历缓存并收集其框架与相关框架相交的任何属性。如果捕获了某个属性,请使用方法layoutAttributesForItemAt(如果您是布局管理器的子类,则为另一个基本函数)以提取所需的值。
虽然很难确切地看到代码中发生了什么,但我认为问题是layoutInfo和infoDic的结构方式不适合手头的任务(是字典吗?),因此编码体操试图得到一个结果!无论如何,希望有所帮助。