这是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)
}

当我删除项目时,它可以删除并带有淡入淡出的动画

ios - 协议(protocol)功能无法快速运行3-LMLPHP

最佳答案

animationDidStop(_:finished:) 没有被调用,因为您已指定第一个参数为可选参数,但不是。

顺便说一句,如果您指定MyCollectionViewCell符合 CAAnimationDelegate (例如,在如下所示的扩展名中),则编译器会警告您有关此问题的信息:

ios - 协议(protocol)功能无法快速运行3-LMLPHP

它应该是:

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() { ... }
}

10-04 10:18