这是cardCollectionView应用程序,我试图用longpress删除项目并在项目中显示删除按钮。我已经可以删除项目,但是我的项目无法重新加载到空的地方。我发现问题是因为有一个协议功能无法正常工作。
这是我的协议:
@objc protocol ActionDelegation:class {
func deleteCell(_ indexPath:IndexPath, _ cellView:MyCollectionViewCell)
func hideAllDeleteBtn()
func showAllDeleteBtn()
}
hideAllDeleteBtn()
和showAllDeleteBtn()
函数运行良好,但deleteCell(_ indexPath:IndexPath, _ cellView:MyCollectionViewCell)
函数从不运行。weak var delegation : ActionDelegation!
我在这里尝试
print()
,但根本没有在此函数中运行(在MyCollectionViewCell
类中)func animationDidStop(_ theAnimation: CAAnimation!, finished flag: Bool){
delegation.deleteCell(path, self)
}
这是ViewController类
我在其中一项功能中做了
cell.delegation = self
在我用不受欢迎的动画点击“删除”按钮后,它应该可以使用
func deleteCell(_ indexPath:IndexPath, _ cellView:MyCollectionViewCell){ print("1")
myCollectionView.performBatchUpdates({ () -> Void in
print("2")
self.cellArray.removeObject(at: indexPath.row)
self.myCollectionView.deleteItems(at: [indexPath])
print("3")
}, completion: {(flag:Bool) in
print("4")
self.myCollectionView.reloadData()
print("5")
})
}
是的...此函数永远不会起作用,如果此函数正在起作用,则空白处不应为空。
仅供参考,其他两个协议功能都起作用,为什么只有这个不能呢?
编辑
这是动画部分,它在扩展NSObject的
Animation
类中 class Animation: NSObject {
func fadeAnimation(view:UIView){
let animation = CATransition()
animation.delegate = view as? CAAnimationDelegate
animation.duration = 0.5
view.layer.add(animation, forKey: nil)
view.isHidden = true
}}
它将调用
MyCollectionViewCell
如下所示(在MyCollectionViewCell
中)let animation = Animation()
func setAnimation(){
animation.fadeAnimation(view: self)
}
当我删除项目时,它可以删除并带有淡入淡出的动画
最佳答案
animationDidStop(_:finished:)
没有被调用,因为您已指定第一个参数为可选参数,但不是。
顺便说一句,如果您指定MyCollectionViewCell
符合 CAAnimationDelegate
(例如,在如下所示的扩展名中),则编译器会警告您有关此问题的信息:
它应该是:
extension MyCollectionViewCell: CAAnimationDelegate {
func animationDidStop(_ anim: CAAnimation, finished flag: Bool) {
...
}
}
将来,我可能建议使用基于块的动画来简化动画中与委托相关的所有问题。
protocol ActionDelegate: class {
func deleteCell(_ cell: UICollectionViewCell)
func hideAllDeleteBtn()
func showAllDeleteBtn()
}
class MyCollectionViewCell: UICollectionViewCell {
weak var delegate: ActionDelegate?
func fadeAndDelete() {
UIView.animate(withDuration: 0.5, animations: {
self.alpha = 0
}, completion: { _ in
self.delegate?.deleteCell(self)
})
}
}
注意,我简化了
deleteCell(_:)
委托方法,因为您不应该保存IndexPath
,而应及时进行计算:extension ViewController: ActionDelegate {
func deleteCell(_ cell: UICollectionViewCell) {
guard let indexPath = myCollectionView.indexPath(for: cell) else { return }
cellArray.removeObject(at: indexPath.row) // I might suggest making `cellArray` a Swift array rather than a `NSMutableArray`
myCollectionView.deleteItems(at: [indexPath])
}
func hideAllDeleteBtn() { ... }
func showAllDeleteBtn() { ... }
}