layoutAttributesForElementsInRect Swift 3(UICollectionView)

时间:2016-11-07 21:41:12

标签: ios swift xcode epg

此代码曾用于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

1 个答案:

答案 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的结构方式不适合手头的任务(是字典吗?),因此编码体操试图得到一个结果!无论如何,希望有所帮助。