将我的项目从Swift 1.2迁移到2.0时遇到了一个问题:我正在为我的UICollectionView使用自定义布局,这在Swift 1.2中运行良好。但是,在Swift 2.0中,尝试覆盖自定义布局中的Method does not override any method from its superclass
时出现错误layoutAttributesForElementsInRect
。
我尝试删除override
,现在错误变为Method 'layoutAttributesForElementsInRect' with Objective-C selector 'layoutAttributesForElementsInRect:' conflicts with method 'layoutAttributesForElementsInRect' from superclass 'UICollectionViewLayout' with the same Objective-C selector
。它让我无能为力。任何帮助将不胜感激!
class CustomCollectionViewLayout: UICollectionViewLayout {
//...
override func layoutAttributesForElementsInRect(rect: CGRect) -> [AnyObject]? {
let attributes : NSMutableArray = NSMutableArray()
for section in self.itemAttributes {
attributes.addObjectsFromArray(
section.filteredArrayUsingPredicate(
NSPredicate(block: { (evaluatedObject, bindings) -> Bool in
return CGRectIntersectsRect(rect, evaluatedObject.frame)
})
)
)
}
return attributes as [AnyObject]
}
}
答案 0 :(得分:8)
您已声明错误的返回类型,这就是为什么编译器不允许您使用override
,并且您也不会重载方法,因为重载方法必须具有不同的参数类型;仅仅有一个不同的返回类型是不够的。此方法的正确签名为func layoutAttributesForElementsInRect(_ rect: CGRect) -> [UICollectionViewLayoutAttributes]?
。
虽然我们正在努力,但不要使用let attributes : NSMutableArray = NSMutableArray()
。不仅类型说明符: NSMutableArray
是冗余的(因为编译器可以从右侧推断出类型),但是使用Swift的内置Array
更容易代替。只需将其从let
(只读)更改为var
即可使其变为可变。换句话说,var attributes = [UICollectionViewLayoutAttributes]()
更好。