2016-11-07 4 views
1

Этот код использовался для работы в swift 2.3 и ранее. Но когда я обновил его в Swift 3, приложение рушится.layoutAttributesForElementsInRect Swift 3 (UICollectionView)

Это код в быстром 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 
} 

это обновленная версия Свифт 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 
} 

Я получаю эту аварию в} как! (Любой, Любой, UnsafeMutablePointer) -> Пустота) EXC_BREAKPOINT

Кто-нибудь может мне помочь?

Это проект, который я взял у этого парня. https://github.com/CoderXpert/EPGGrid

ответ

1

Я думаю, вам удалось как-то связать себя с узлами этой теме. (Это всегда предупреждающий знак, если я в конечном итоге использую много типов кастинга и ObjectiveC в том, что предполагается для кода Swift). Я просто должен был посмотреть на реализацию layoutAttributesForElements (в) в одном из моих приложений, и она сводится к следующему:

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 
} 

В этом варианте осуществления, кэш является массив UICollectionViewLayoutAttributes, который готовится, когда коллекция представление инициализируется или данные изменяются (с помощью метода prepare()). Убедившись, что кеш не пуст, все, что вам нужно сделать, это перебрать кеш и собрать любые атрибуты, чей кадр пересекает рассматриваемый кадр. Если атрибут пойман, используйте метод layoutAttributesForItemAt (еще одна важная функция, если вы подклассифицируете диспетчер компоновки), чтобы вывести требуемые значения.

Хотя трудно понять, что происходит в вашем коде, я думаю, проблема в том, что layoutInfo и infoDic структурированы таким образом, который не подходит под задачу (это словари?), Следовательно кодирование гимнастики, чтобы попытаться получить результат! В любом случае, надеюсь, что это поможет.

+0

Да, это словари .. есть способ, которым я могу заполнить кеш с моим layoutInfo и infoDic? – jboisjoli