Ios 是否从UICollectionViewCell中删除单元格和相应的图像?

Ios 是否从UICollectionViewCell中删除单元格和相应的图像?,ios,swift,uiimageview,uicollectionview,uicollectionviewcell,Ios,Swift,Uiimageview,Uicollectionview,Uicollectionviewcell,我有一个水平UICollectionView和一个自定义UICollectionViewCell。每个单元格都有一个UIImageView,显示用户选择的图像。 现在,我想做的是在每个单元格的角落添加一个删除按钮(或图像?),单击该按钮时,它会从数组和单元格本身删除相应的图像。我有两个问题: 如何以编程方式添加按钮/图像功能(我真的不想弄乱故事板) 如何从相应的UIViewController实现删除功能 大概是这样的: 这是我的自定义单元格类: class PhotoCell: UICol

我有一个水平
UICollectionView
和一个自定义
UICollectionViewCell
。每个单元格都有一个
UIImageView
,显示用户选择的图像。 现在,我想做的是在每个单元格的角落添加一个删除按钮(或图像?),单击该按钮时,它会从数组和单元格本身删除相应的图像。我有两个问题:

  • 如何以编程方式添加按钮/图像功能(我真的不想弄乱故事板)
  • 如何从相应的
    UIViewController
    实现删除功能
  • 大概是这样的:

    这是我的自定义单元格类:

    class PhotoCell: UICollectionViewCell, UIGestureRecognizerDelegate
    {
        @IBOutlet weak var cellImage: UIImageView!
    
        override func awakeFromNib()
        {
            super.awakeFromNib()
            setupUI()
        }
    
        func setupUI()
        {
            cellImage.layer.cornerRadius = 5
            cellImage.clipsToBounds = true
            cellImage.contentMode = .scaleAspectFill
        }
    }
    
    class MyCollectionCell: UICollectionViewCell {
    
        var callback : ((MyCollectionCell)->Void)?  // option callback
        @IBOutlet weak var buttonX: UIButton!   // option button tag
        @IBOutlet weak var myTitlteLabel: UILabel!
        @IBAction func removeButtonAction(_ sender: Any) {
            callback?(self)
        }
    }
    
    下面是整个视图控制器的代码

       import UIKit
        import SDWebImage
        import Photos
        import AssetsPickerViewController
        import SVProgressHUD
    
        class PhotoVC: UIViewController
        {
            // MARK: IBOutlets
            @IBOutlet weak var collectionView: UICollectionView!
            @IBOutlet weak var postButton: UIButton!
            @IBOutlet weak var userProfileImage: UIImageView!
            @IBOutlet weak var userUsername: UsernameLabel!
            @IBOutlet weak var postTitleTextField: UITextField!
            @IBOutlet weak var postContentTextField: UITextView!
            @IBOutlet weak var postTagsTextField: UITextField!
            @IBOutlet weak var postSourceTextField: UITextField!
    
            // MARK: Class Properties
            var user: UserModel!
            var post: Post!
            var cameraPhotoUIImage: UIImage?
            var assets = [PHAsset]()
            lazy var assetsTurnedIntoImages =
            {
                return  [UIImage]()
            }()
    
            lazy var imageManager = {
                return PHCachingImageManager()
            }()
    
            // MARK: View Did Load
            override func viewDidLoad()
            {
                self.assetsTurnedIntoImages = [UIImage](repeating: UIImage(), count: assets.count) // Important! make sure to have enough pre-created space in the array
                super.viewDidLoad()
                setupCollectionView()
            }
    
            // MARK: View Did Appear
            override func viewDidAppear(_ animated: Bool) {
                super.viewDidAppear(animated)
                fetchUserUsernameAndProfileImage()
                userProfileImageSetup()
                handlePostButtonState()
                collectionView.reloadData()
            }
    
            // MARK: View Will Disappear
            override func viewWillDisappear(_ animated: Bool) {
                super.viewWillDisappear(animated)
                emptyArrays()
             }
    
            // MARK: Fetch User Username And Profile Photo
            func fetchUserUsernameAndProfileImage()
            {
                Api.User.observeCurrentUser
                { (userModel) in
                    self.user = userModel
                    self.userUsername.text = userModel.username_lowercase!
                    if let userProfileImageURL = URL(string: userModel.profileImageUrlString!)
                    {
                        self.userProfileImage.sd_setImage(with: userProfileImageURL, placeholderImage: UIImage(named: "default_profileHeader"))
                    }
                }
            }
    
            // MARK: Cancel Pressed
            @IBAction func cancelPressed(_ sender: UIButton)
            {
                emptyArrays()
                collectionView.reloadData()
                dismiss(animated: true, completion: nil)
            }
    
            // MARK: Post Pressed
            @IBAction func postPressed(_ sender: UIButton)
            {
                guard let title = postTitleTextField.text else { return }
                guard let content = postContentTextField.text else { return }
                guard let tags = postTagsTextField.text else { return }
                guard let source = postSourceTextField.text else { return }
    
                view.endEditing(true)
                SVProgressHUD.setDefaultMaskType(.gradient)
                SVProgressHUD.show(withStatus: "Posting...")
                print("Assets turned into images before posting is:", assetsTurnedIntoImages.count)
                if let takenImage = cameraPhotoUIImage
                {
                    let imageToUpload = takenImage
    
                    if let imageData = UIImageJPEGRepresentation(imageToUpload, 0.1)
                    {
                        let ratio: [CGFloat] = [imageToUpload.size.width / imageToUpload.size.height]
                        DatabaseService.uploadDataToServer(data: imageData, videoUrl: nil, multipleImages: nil, ratio: ratio, title: title, content: content, tags: tags, source: source,
                                                           onSuccess:
                                                           {
                                                                self.clean()
                                                                self.performSegue(withIdentifier: Segue_PhotoPostToTabbar, sender: nil)
                                                           })
                    }
                }
                else if assetsTurnedIntoImages.count > 0
                {
                    DatabaseService.uploadDataToServer(data: nil, videoUrl: nil, multipleImages: assetsTurnedIntoImages, ratio: nil, title: title, content: title, tags: tags, source: source,
                                                       onSuccess:
                                                       {
                                                        self.clean()
                                                        self.performSegue(withIdentifier: Segue_PhotoPostToTabbar, sender: nil)
                                                       })
                }
                else
                {
                    SVProgressHUD.showError(withStatus: "At least 1 photo is required to make this post.")
                }
            }
    
            @IBAction func settingsPressed(_ sender: UIButton)
            {
                //TODO: Work on settings for the post
            }
    
            // MARK: End Editing
            override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
            {
                view.endEditing(true)
            }
    
            // MARK: Clean Text Fields And Arrays
            func clean()
            {
                postTitleTextField.text = ""
                postTagsTextField.text = ""
                postContentTextField.text = ""
                postSourceTextField.text = ""
                emptyArrays()
            }
    
            // MARK: Empty Arrays
            func emptyArrays()
            {
                assets.removeAll()
                assetsTurnedIntoImages.removeAll()
                cameraPhotoUIImage = nil
                collectionView.reloadData()
            }
    
            // MARK: Handle Post Button State
            func handlePostButtonState()
            {
                if cameraPhotoUIImage != nil || assets.count > 0
                {
                    postButton.isEnabled = true
                }
                else
                {
                    postButton.isEnabled = false
                }
            }
    
            // MARK: User Profile UI Update
            func userProfileImageSetup()
            {
                userProfileImage.layer.cornerRadius = userProfileImage.frame.size.width / 2
                userProfileImage.clipsToBounds = true
            }
    
        }
    
        // MARK: Collectionew View Delegate & Datasourse
        extension PhotoVC : UICollectionViewDataSource, UICollectionViewDelegate
        {
            func setupCollectionView()
            {
                collectionView.dataSource = self
                collectionView.delegate = self
            }
    
            func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
            {
                    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "PhotoPostCVCell", for: indexPath) as! PhotoPostCVCell
                    if let takenImage = cameraPhotoUIImage
                    {
                        cell.cellImage.image = takenImage
                    }
                    if assets.count > 0
                    {
                        let asset = assets[indexPath.row]
    
                        var imageRequestOptions: PHImageRequestOptions
                        {
                            let options = PHImageRequestOptions()
                            options.version = .current
                            options.resizeMode = .exact
                            options.deliveryMode = .fastFormat
                            options.isSynchronous = true
                            return options
                        }
                        // TODO: Fix the size of the images. Right now it's 500x500
                        let targetSize = CGSize(width: 500, height: 500)
                        imageManager.requestImage(for: asset, targetSize: targetSize, contentMode: .aspectFill, options: imageRequestOptions)
                        { (image, info) in
                            if image != nil
                            {
                                print(image!.size)
                                cell.cellImage.image = image
                                self.assetsTurnedIntoImages[indexPath.row] = image!
                                cell.deleteButton?.tag = indexPath.row
                                cell.deleteButton?.addTarget(self, action: #selector(self.deleteImage(sender:)), for: UIControlEvents.touchUpInside)
                            }
                        }
                    }
                    return cell
            }
    
            @objc func deleteImage(sender:UIButton) {
                let i = sender.tag
                print(i)
                assetsTurnedIntoImages.remove(at: i)
                collectionView.reloadData()
            }
    
            func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
            {
                if assetsTurnedIntoImages.count > 0
                {
                    return assetsTurnedIntoImages.count
                }
                else
                {
                    return 1
                }
            }
    
            // MARK: Preview Selected Image
            func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
            {
                let postStoryboard = UIStoryboard(name: Storyboard_Post, bundle:nil)
    
                if let destinationVC = postStoryboard.instantiateViewController(withIdentifier: "PreviewImageVC") as? PreviewImageVC
                {
                    destinationVC.allowedDismissDirection = .both
                    destinationVC.maskType = .clear
                    if cameraPhotoUIImage != nil
                    {
                        destinationVC.transferedImageToPreview = cameraPhotoUIImage!
                        destinationVC.showInteractive()
                    }
                    if assetsTurnedIntoImages.count > 0
                    {
                        destinationVC.transferedImageToPreview = assetsTurnedIntoImages[indexPath.row]
                        destinationVC.showInteractive()
                    }
    
                }
            }
        }
    
    导入UIKit
    导入SDWebImage
    导入照片
    导入资产PickerViewController
    导入SVProgressHUD
    类PhotoVC:UIViewController
    {
    //马克:Ibouts
    @ibvar collectionView:UICollectionView!
    @IBVAR按钮:UIButton!
    @ibvar userProfileImage:UIImageView!
    @ibvar useruserusername:usernamelab!
    @IBOutlet弱var postTitleTextField:UITextField!
    @IBOutlet弱var postContentTextField:UITextView!
    @IBVAR postTagsTextField:UITextField!
    @IBOutlet弱var postSourceTextField:UITextField!
    //标记:类属性
    var用户:UserModel!
    var post:post!
    var cameraPhotoUIImage:UIImage?
    var资产=[PHAsset]()
    惰性var资产转为映像=
    {
    返回[UIImage]()
    }()
    惰性变量imageManager={
    返回PHCachingImageManager()
    }()
    //马克:视图没有加载
    重写func viewDidLoad()
    {
    self.assetsTurnedToImages=[UIImage](重复:UIImage(),count:assets.count)//重要!确保数组中有足够的预创建空间
    super.viewDidLoad()
    setupCollectionView()
    }
    //马克:视图确实出现了
    覆盖函数视图显示(u动画:Bool){
    super.viewdide显示(动画)
    FetchUserName和ProfileImage()
    userProfileImageSetup()
    handlePostButtonState()
    collectionView.reloadData()
    }
    //马克:视图将消失
    覆盖函数视图将消失(u动画:Bool){
    超级。视图将消失(动画)
    空的光线()
    }
    //标记:获取用户用户名和个人资料照片
    func fetchUserName和ProfileImage()
    {
    Api.User.observeCurrentUser
    {(用户模型)在
    self.user=userModel
    self.userUsername.text=userModel.username\u小写!
    如果让userProfileImageURL=URL(字符串:userModel.profileImageUrlString!)
    {
    self.userProfileImage.sd_setImage(带:userProfileImageURL,占位符image:UIImage(名为:“default_profileHeader”))
    }
    }
    }
    //标记:按取消键
    @iAction func cancelPressed(uSender:ui按钮)
    {
    空的光线()
    collectionView.reloadData()
    驳回(动画:真,完成:无)
    }
    //标记:后压
    @iAction func已后期压缩(uSender:ui按钮)
    {
    guard let title=postTitleTextField.text else{return}
    guard let content=postContentTextField.text else{return}
    guard let tags=postTagsTextField.text else{return}
    guard let source=postSourceTextField.text else{return}
    view.endEditing(真)
    SVProgressHUD.setDefaultMaskType(.gradient)
    SVProgressHUD.show(状态为:“发布…”)
    打印(“过帐前转换为图像的资产为:”,资产转换为图像。计数)
    如果let takenImage=cameraPhotoUIImage
    {
    让imageToUpload=获取图像
    如果让imageData=UIImageJPEG表示(imageToUpload,0.1)
    {
    let ratio:[CGFloat]=[imageToUpload.size.width/imageToUpload.size.height]
    DatabaseService.uploadDataToServer(数据:imageData,videoUrl:nil,multipleImages:nil,ratio:ratio,title:title,content:content,tags:tags,source:source,
    一旦成功:
    {
    self.clean()
    self.performsgue(标识符:Segue_photoposttoabar,发送方:nil)
    })
    }
    }
    否则,如果资产转到mages.count>0
    {
    DatabaseService.uploadDataToServer(数据:nil,视频URL:nil,多个图像:资产转换为图像,比率:nil,标题:标题,内容:标题,标签:标签,来源:source,
    一旦成功:
    {
    self.clean()
    self.performsgue(标识符:Segue_photoposttoabar,发送方:nil)
    })
    }
    其他的
    {
    SVProgressHUD.batherRor(和Status一起:“至少需要一张照片才能发表这篇文章。”)
    }
    }
    @iAction func设置已按下(u发送方:ui按钮)
    {
    //TODO:处理帖子的设置
    }
    //标记:结束编辑
    覆盖func TouchesBegind(Touchs:Set,带有事件:UIEvent?)
    
    class MyCollectionCell: UICollectionViewCell {
    
        var callback : ((MyCollectionCell)->Void)?  // option callback
        @IBOutlet weak var buttonX: UIButton!   // option button tag
        @IBOutlet weak var myTitlteLabel: UILabel!
        @IBAction func removeButtonAction(_ sender: Any) {
            callback?(self)
        }
    }
    
    class CustomCell: UICollectionViewCell {
    
        @IBOutlet weak var deleteButton: UIButton!
    
    }
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! CustomCell
        cell.deleteButton?.tag = indexPath.row
        cell.deleteButton?.addTarget(self, action: #selector(deleteUser(sender:)), for: UIControlEvents.touchUpInside)
        // Do other cell setup here with data source
        return cell
    }
    
    @objc func deleteUser(sender:UIButton) {
        let i = sender.tag
        dataSource.remove(at: i)
        collectionView.reloadData()
    }