【发布时间】:2019-12-24 11:33:45
【问题描述】:
我正在使用 collectionView 来显示照片并委托函数来查看自定义警报。 在照片上,我有用于删除照片的十字标记。我的委托功能和显示项目都工作正常。 但是当我必须从服务器中删除照片时,我遇到了问题。因为我需要将确切的图像 ID 传递给 Web 服务才能将其从服务器中删除。如果我使用 cell.tag 的东西,它给我的行值为 1,但实际的 imgID 是 40992。我怎样才能将此值传递给我的删除委托函数?
结构:
单元格项目显示 --tap 手势调用 removeImage func --- 自定义警报 -- 在 Delete 按钮上 -- didDeleteButtonClicked 调用。
我在 cellForItem 中需要的主要值:
let imgId = AppData?.imageList?[indexPath.row].projectUnitImageId
照片视图控制器:
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
print(imgId)
cell.closeIcon.isUserInteractionEnabled = true
cell.closeIcon.tag = imgId ?? 0
deleteAlertView.delegate = self
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){
print(imgId)
let fotoXib = Bundle.main.loadNibNamed("FotoDeleteAlert", owner: self, options: nil)
let alertView = fotoXib?.first as! FotoDeleteAlert
alertView.delegate = self
self.view.addSubview(alertView)
}
//MARK: - Delegate Function
extension PhotoCollectionViewController: handleDeleteAction {
func didDeleteButtonClicked(_ sender: UIButton) {
print("delegate")
let row = sender.tag
print(row)
// I have to call my delete webServices here and have to pass imgId
deleteWebservices(imgId)
}
}
FotoAlert Xib 自定义提醒:
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: UIButton) {
self.delegate?.didDeleteButtonClicked(sender)
removeFromSuperview()
}
}
【问题讨论】:
-
请添加此行并检查 propar indexpath 行 cell.deleteBtn.tag = indexpath.row
-
单元格是可重复使用的,因此您无法使用单元格标签删除,因为创建的单元格数量有限,这些单元格在屏幕上可见,下次单元格重用时,如果只有 10 个单元格可见,那么您获得的最大单元格标签为 9甚至项目数以百万计。
标签: ios swift uitableview uicollectionview delegates