我创建了PhotoCollectionViewController
,其中包含使用Alamofire
从服务器获取的所有照片。现在我想在照片上实现删除功能。我已经用tap-gesture
了。创建自定义警报Xib并成功显示。自定义警报xib具有两个按钮cancel
和Delete
。在删除按钮上,我创建了委托,但由于某种原因,即使不能正确调用,它也无法正常工作。实际上,我必须通过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()
}
}
使用此方法:
@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
您只需要替换
let deleteAlertView: FotoDeleteAlert? = nil
与
let deleteAlertView = FotoDeleteAlert()
之所以这样,是因为deleteAlertView保持为零。您没有初始化它。您还可以按照下面的说明进行初始化。
deleteAlertView = FotoDeleteAlert()
deleteAlertView?.delegate = self
您尚未初始化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)
}
}