在删除CollectionView项Swift时未正确调用委托函数

问题描述 投票:2回答:2

我创建了PhotoCollectionViewController,其中包含使用Alamofire从服务器获取的所有照片。现在我想在照片上实现删除功能。我已经用tap-gesture了。创建自定义警报Xib并成功显示。自定义警报xib具有两个按钮cancelDelete。在删除按钮上,我创建了委托,但由于某种原因,即使不能正确调用,它也无法正常工作。实际上,我必须通过AppData?.imageList?[indexPath.row].projectUnitImageId这是imageID才能将其从服务器中删除。无需委派和网络服务即可手动进行。但是一旦我使用了委托函数就不会调用。

问题:

  • 需要使用委托或其他方式才能删除。
  • AppData?.imageList?[indexPath.row].projectUnitImageId必须传递ImageId值才能删除Image Web服务调用,但是如何?

[任何人都可以指导我。

Xib FotoDeleteAlert和代表:

protocol handleDeleteAction {
    func didDeleteButtonClicked(_: UIButton)
}

@IBDesignable class FotoDeleteAlert: UIView {

    var delegate: handleDeleteAction?

    @IBOutlet weak var deleteBtn: UIButton!

    override func awakeFromNib() {
        super.awakeFromNib()
        layoutIfNeeded()
        deleteBtn.addTarget(self, action: #selector(didDelete(_:)), for: .touchUpInside)
    }

    @IBAction func didCancel(_ sender: Any) {
        removeFromSuperview()
    }

    @IBAction func didDelete(_ sender: Any) {

        self.delegate?.didDeleteButtonClicked(sender as! UIButton)


    }
}

PhotoCollectionViewController:

let deleteAlertView: FotoDeleteAlert? = nil  // defined on the top

public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellName, for: indexPath) as! PhotoCollectionViewCell


            if(indexPath.row < (AppData?.imageList?.count ?? 0)){
                cell.imageView.isHidden = false
                cell.closeIcon.isHidden = false
                cell.addIcon.isHidden = true
                let dic = AppData?.imageList?[indexPath.row].url ?? " "
                cell.imageView.image =  UIImage(url: URL(string: dic))


                let imgId = AppData?.imageList?[indexPath.row].projectUnitImageId
                cell.closeIcon.isUserInteractionEnabled = true
                cell.closeIcon.tag = indexPath.row
                let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(removeImage(_:)))
                cell.closeIcon.addGestureRecognizer(tapGestureRecognizer)

            } else {
                cell.imageView.isHidden = true
                cell.closeIcon.isHidden = true
                cell.addIcon.isHidden = false
            }

            return cell
        }

@objc func removeImage(_ sender: AnyObject){

            deleteAlertView?.delegate = self
            let alert = FotoDeleteAlert.loadViewFromNib()
            alert!.frame = self.view.bounds
            self.view.addSubview(alert!)

        }


//MARK: - Delegate Function

    extension PhotoCollectionViewController: handleDeleteAction {

        func didDeleteButtonClicked(_ sender: UIButton) {
            // below code manual working without delegate and web services work.

            let row = sender.view.tag
            self.data?.remove(at: row.row)
            self.images?.remove(at: row.row)
            self.collectionView.reloadData()

        }
    }


ios swift uicollectionview delegates appdelegate
2个回答
0
投票

使用此方法:

@objc func removeImage(_ sender: AnyObject){
            deleteAlertView?.delegate = self
            let alert = FotoDeleteAlert.loadViewFromNib()
            alert!.frame = self.view.bounds
            self.view.addSubview(alert!)
        }

您正在将委托设置在未初始化的警报视图上(此时将为nil)。在创建的警报上设置委托:

 let alert = FotoDeleteAlert.loadViewFromNib()
 alert!.frame = self.view.bounds
 alert!.delegate = self
 self.view.addSubview(alert!)

从您发布的代码中,我看不到用于存储deleteAlertView


0
投票

您只需要替换

let deleteAlertView: FotoDeleteAlert? = nil 

let deleteAlertView = FotoDeleteAlert()

之所以这样,是因为deleteAlertView保持为零。您没有初始化它。您还可以按照下面的说明进行初始化。

deleteAlertView = FotoDeleteAlert()
 deleteAlertView?.delegate = self

0
投票

您尚未初始化AlertView。因此,首先您必须按帧初始化警报视图。

如下:

@objc func removeImage(_ sender: AnyObject){
        deleteAlertView = FotoDeleteAlert(frame: .zero)
        deleteAlertView?.delegate = self
        let alert = FotoDeleteAlert.loadViewFromNib()
        alert!.frame = self.view.bounds
        self.view.addSubview(alert!)

    }

then you have your target should assign in `override func awakeFromNib()`

请参见下面的代码:

@IBDesignable class FotoDeleteAlert: UIView {

var delegate: handleDeleteAction?

@IBOutlet weak var deleteBtn: UIButton!

override func awakeFromNib() {
    super.awakeFromNib()


}

override init(frame: CGRect) {
    super.init(frame: frame)
    layoutIfNeeded()
    deleteBtn.addTarget(self, action: #selector(didDelete(_:)), for: .touchUpInside)
}

@IBAction func didCancel(_ sender: Any) {
    removeFromSuperview()
}

@IBAction func didDelete(_ sender: Any) {

    self.delegate?.didDeleteButtonClicked(sender as! UIButton)


    }
}
© www.soinside.com 2019 - 2024. All rights reserved.