Ios 自定义UICollectionViewLayout';s LayoutAttributesForelementsRect不会重写Swift 2.0中其超类中的任何方法
将我的项目从Swift 1.2迁移到2.0时,我遇到了一个问题:我正在为我的UICollectionView使用自定义布局,该布局在Swift 1.2中运行良好。但是,在Swift 2.0中,当试图覆盖自定义布局中的Ios 自定义UICollectionViewLayout';s LayoutAttributesForelementsRect不会重写Swift 2.0中其超类中的任何方法,ios,swift,uicollectionview,swift2,uicollectionviewlayout,Ios,Swift,Uicollectionview,Swift2,Uicollectionviewlayout,将我的项目从Swift 1.2迁移到2.0时,我遇到了一个问题:我正在为我的UICollectionView使用自定义布局,该布局在Swift 1.2中运行良好。但是,在Swift 2.0中,当试图覆盖自定义布局中的layoutAttributesForElementsInRect时,会出现一个错误,即方法不会覆盖其超类中的任何方法 我试图删除覆盖,现在错误变成方法'layoutAttributesForElementsInRect',带有Objective-C选择器'layoutAttribu
layoutAttributesForElementsInRect
时,会出现一个错误,即方法不会覆盖其超类中的任何方法
我试图删除覆盖
,现在错误变成方法'layoutAttributesForElementsInRect',带有Objective-C选择器'layoutAttributesForElementsInRect:'与超类'UICollectionViewLayout'中的方法'layoutAttributesForElementsInRect'冲突,该方法具有相同的Objective-C选择器
。这让我不知所措。任何帮助都将不胜感激
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]
}
}
您声明了错误的返回类型,这就是为什么编译器不允许您使用覆盖
,并且您也没有重载该方法,因为重载的方法必须具有不同的参数类型;只有不同的返回类型是不够的。此方法的正确签名是func layouttributesforementsinrect(\urect:CGRect)->[UICollectionViewLayouttributes]?
当我们使用时,不要使用let attributes:NSMutableArray=NSMutableArray()
。不仅类型说明符:NSMutableArray
是多余的(因为编译器可以从右边推断类型),而且更容易使用Swift的内置数组
。只需将其从let
(只读)更改为var
,即可使其可变。换句话说,var attributes=[UICollectionViewLayoutAttributes]()
更好。您声明了错误的返回类型,这就是为什么编译器不允许您使用覆盖
,并且您也没有重载该方法,因为重载的方法必须具有不同的参数类型;只有不同的返回类型是不够的。此方法的正确签名是func layouttributesforementsinrect(\urect:CGRect)->[UICollectionViewLayouttributes]?
当我们使用时,不要使用let attributes:NSMutableArray=NSMutableArray()
。不仅类型说明符:NSMutableArray
是多余的(因为编译器可以从右边推断类型),而且更容易使用Swift的内置数组
。只需将其从let
(只读)更改为var
,即可使其可变。换句话说,var attributes=[UICollectionViewLayoutAttributes]()(
更好。非常感谢您,它现在可以很好地编译和运行了!但它现在在调试区域:CGContextSaveGState:invalid context 0x0中发出错误消息。如果要查看回溯,请设置CG\U CONTEXT\U SHOW\U backtrace环境变量。
。我一定要担心吗?我不知道。我昨天刚开始在我的一个操场上看到同样的错误。我一直忽略它,因为一切似乎都运行得很好,但如果它发生在一个生产应用程序中,那将是一个需要调查的问题。非常感谢,它现在编译并运行得很好!但它现在在调试区域:CGContextSaveGState:invalid context 0x0中发出错误消息。如果要查看回溯,请设置CG\U CONTEXT\U SHOW\U backtrace环境变量。
。我一定要担心吗?我不知道。我昨天刚开始在我的一个操场上看到同样的错误。我一直忽略它,因为一切似乎都运行得很好,但如果它发生在一个生产应用程序中,那将是需要调查的事情。