2016-09-09 79 views
0

我将我的项目从快捷2迅速3,我有困难理解什么是错用下面的函数:layoutAttributesForElements函数给出错误警告

override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? { 
    var attributes = [UICollectionViewLayoutAttributes]() 
    if self.itemAttributes != nil { 
     for section in self.itemAttributes { 

      let filteredArray = (section as AnyObject).filtered(

       using: NSPredicate { (evaluatedObject, bindings) -> Bool in 
        return rect.intersects(evaluatedObject.frame) 
       } 
      ) as! [UICollectionViewLayoutAttributes] 

      attributes.append(contentsOf: filteredArray) 

     } 
    } 

    return attributes 
} 

self.itemAttributes是定义为一个类属性:

var itemAttributes : NSMutableArray!

sectionAttributes被设置在另一个函数:

override func prepare() { 
    if self.collectionView?.numberOfSections == 0 { 
     return 
    } 

    if (self.itemAttributes != nil && self.itemAttributes.count > 0) { 
     for section in 0..<self.collectionView!.numberOfSections { 
      let numberOfItems : Int = self.collectionView!.numberOfItems(inSection: section) 
      for index in 0..<numberOfItems { 
       if section != 0 && index != 0 { 
        continue 
       } 

       let attributes : UICollectionViewLayoutAttributes = self.layoutAttributesForItem(at: IndexPath(item: index, section: section))! 
       if section == 0 { 
        var frame = attributes.frame 
        frame.origin.y = self.collectionView!.contentOffset.y 
        attributes.frame = frame 
       } 

       if index == 0 { 
        var frame = attributes.frame 
        frame.origin.x = self.collectionView!.contentOffset.x 
        attributes.frame = frame 
       } 
      } 
     } 
     return 
    } 

    if (self.itemsSize == nil || self.itemsSize.count != numberOfColumns) { 
     self.calculateItemsSize() 
    } 

    var column = 0 
    var xOffset : CGFloat = 0 
    var yOffset : CGFloat = 0 
    var contentWidth : CGFloat = 0 
    var contentHeight : CGFloat = 0 

    for section in 0..<self.collectionView!.numberOfSections { 
     let sectionAttributes = NSMutableArray() 

     for index in 0..<numberOfColumns { 
      let itemSize = (self.itemsSize[index] as AnyObject).cgSizeValue 
      let indexPath = IndexPath(item: index, section: section) 
      let attributes = UICollectionViewLayoutAttributes(forCellWith: indexPath) 
      attributes.frame = CGRect(x: xOffset, y: yOffset, width: (itemSize?.width)!, height: (itemSize?.height)!).integral 

      if section == 0 && index == 0 { 
       attributes.zIndex = 1024; 
      } else if section == 0 || index == 0 { 
       attributes.zIndex = 1023 
      } 

      if section == 0 { 
       var frame = attributes.frame 
       frame.origin.y = self.collectionView!.contentOffset.y 
       attributes.frame = frame 
      } 
      if index == 0 { 
       var frame = attributes.frame 
       frame.origin.x = self.collectionView!.contentOffset.x 
       attributes.frame = frame 
      } 

      sectionAttributes.add(attributes) 

      xOffset += (itemSize?.width)! 
      column += 1 

      if column == numberOfColumns { 
       if xOffset > contentWidth { 
        contentWidth = xOffset 
       } 

       column = 0 
       xOffset = 0 
       yOffset += (itemSize?.height)! 
      } 
     } 
     if (self.itemAttributes == nil) { 
      self.itemAttributes = NSMutableArray(capacity: self.collectionView!.numberOfSections) 
     } 
     self.itemAttributes .add(sectionAttributes) 
    } 

    let attributes : UICollectionViewLayoutAttributes = (self.itemAttributes.lastObject as AnyObject).lastObject as! UICollectionViewLayoutAttributes 
    contentHeight = attributes.frame.origin.y + attributes.frame.size.height 
    self.contentSize = CGSize(width: contentWidth, height: contentHeight)} 

Xcode中抛出一个Type of expression is ambiguous without more contextreturn rect.intersects(evaluatedObject.frame)线

+0

你的'itemAttributes'(或'sectionAttributes')包含什么?这是你问题的关键部分。您需要尽可能精确地描述“itemAttributes”和“sectionAttributes”。 – OOPer

+0

请更新您的问题并使其成为可重现问题的代码。 – OOPer

+0

我正在更新这个问题,评论中的代码片段很难理解 –

回答

5

layoutAttributesForElements功能在夫特3,值类型的NSMutableArray(或NSArray以及)已成为Any,这与工作一个很难的事情。

您最好尽可能快地将您的数组类型转换为Swift数组。

试试这个:

override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? { 
    var attributes = [UICollectionViewLayoutAttributes]() 
    if let itemAttributes = self.itemAttributes as NSArray as? [[UICollectionViewLayoutAttributes]] { 
     for section in itemAttributes { 
      let filteredArray = section.filter {evaluatedObject in 
       return rect.intersects(evaluatedObject.frame) 
      } 
      attributes.append(contentsOf: filteredArray) 
     } 
    } 
    return attributes 
} 

但我建议你用斯威夫特本地Array S或Dictionary S作为远,你可以。

var itemAttributes: [[UICollectionViewLayoutAttributes]] = [] 

     var sectionAttributes: [UICollectionViewLayoutAttributes] = [] 

(有了这个,你可能需要一些更多的解决方法,但你很快就会发现他们。)

+0

是的,这有助于让错误消失。谢谢! –

0

随着OOPer的帮助下,我做了如下修改代码:

override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? { 
    var attributes = [UICollectionViewLayoutAttributes]() 
    if let itemAttributes = self.itemAttributes { 
     for section in itemAttributes { 
      let filteredArray = section.filter{ evaluatedObject in 
       return rect.intersects(evaluatedObject.frame) 
       } 
      attributes.append(contentsOf: filteredArray) 
     } 
    } 

    return attributes 
} 

override func prepare() { 
    if self.collectionView?.numberOfSections == 0 { 
     return 
    } 

    if (self.itemAttributes.count > 0) { 
     for section in 0..<self.collectionView!.numberOfSections { 
      let numberOfItems : Int = self.collectionView!.numberOfItems(inSection: section) 
      for index in 0..<numberOfItems { 
       if section != 0 && index != 0 { 
        continue 
       } 

       let attributes : UICollectionViewLayoutAttributes = self.layoutAttributesForItem(at: IndexPath(item: index, section: section))! 
       if section == 0 { 
        var frame = attributes.frame 
        frame.origin.y = self.collectionView!.contentOffset.y 
        attributes.frame = frame 
       } 

       if index == 0 { 
        var frame = attributes.frame 
        frame.origin.x = self.collectionView!.contentOffset.x 
        attributes.frame = frame 
       } 
      } 
     } 
     return 
    } 

    if (self.itemsSize == nil || self.itemsSize.count != numberOfColumns) { 
     self.calculateItemsSize() 
    } 

    var column = 0 
    var xOffset : CGFloat = 0 
    var yOffset : CGFloat = 0 
    var contentWidth : CGFloat = 0 
    var contentHeight : CGFloat = 0 

    for section in 0..<self.collectionView!.numberOfSections { 
     var sectionAttributes: [UICollectionViewLayoutAttributes] = [] 

     for index in 0..<numberOfColumns { 
      let itemSize = (self.itemsSize[index] as AnyObject).cgSizeValue 
      let indexPath = IndexPath(item: index, section: section) 
      let attributes = UICollectionViewLayoutAttributes(forCellWith: indexPath) 
      attributes.frame = CGRect(x: xOffset, y: yOffset, width: (itemSize?.width)!, height: (itemSize?.height)!).integral 

      if section == 0 && index == 0 { 
       attributes.zIndex = 1024; 
      } else if section == 0 || index == 0 { 
       attributes.zIndex = 1023 
      } 

      if section == 0 { 
       var frame = attributes.frame 
       frame.origin.y = self.collectionView!.contentOffset.y 
       attributes.frame = frame 
      } 
      if index == 0 { 
       var frame = attributes.frame 
       frame.origin.x = self.collectionView!.contentOffset.x 
       attributes.frame = frame 
      } 

      sectionAttributes.append(attributes) 

      xOffset += (itemSize?.width)! 
      column += 1 

      if column == numberOfColumns { 
       if xOffset > contentWidth { 
        contentWidth = xOffset 
       } 

       column = 0 
       xOffset = 0 
       yOffset += (itemSize?.height)! 
      } 
     } 
     self.itemAttributes.append(sectionAttributes) 
    } 

    if let attributes = self.itemAttributes.last?.last { 
     contentHeight = attributes.frame.origin.y + attributes.frame.size.height 
     self.contentSize = CGSize(width: contentWidth, height: contentHeight) 
    } 
} 

var itemAttributes : [[UICollectionViewLayoutAttributes]]!