点击TableViewCell图像(swift)后,如何在主VC上调用/显示拍摄行动表或从图库中选择照片

点击TableViewCell图像(swift)后,如何在主VC上调用/显示拍摄行动表或从图库中选择照片,swift,Swift,[结果]在tableview单元格中点击的个人资料图片上,我想显示警报 TableViewCell Here I Try MVVM pattern to achieve TableView but for showing alert I face problems , it compiles successfully but not showing alert. import Foundation import UIKit class ParentsImageCell : UITableVi

[结果]在tableview单元格中点击的个人资料图片上,我想显示警报

TableViewCell

Here I Try MVVM pattern to achieve TableView but for showing alert I face problems , it compiles successfully but not showing alert.
import Foundation
import UIKit

class ParentsImageCell : UITableViewCell {
    weak var myVC : ProfileOfParentsDetailsViewController?
    var parentProfileVC = ProfileOfParentsDetailsViewController()
    
    @IBOutlet weak var imageProfile : UIImageView!
    var items : ParentProfileViewModelItem? {
        didSet {
            guard let items = items as? ParentProfileViewModelProfileItem else {
                return
            }
            imageProfile?.image = UIImage(named: items.profileImg)

        }
    }
    
     static var nib:UINib {
            return UINib(nibName: identifier, bundle: nil)
        }
        
        static var identifier: String {
            return String(describing: self)
        }
        
        override func awakeFromNib() {
            super.awakeFromNib()
            
            imageProfile?.layer.cornerRadius = 62
            imageProfile?.clipsToBounds = true
            imageProfile?.contentMode = .scaleAspectFill
            imageProfile?.backgroundColor = UIColor.lightGray
            //Add Tapped Gesture
            imageProfile.isUserInteractionEnabled = true
            
            let gesture = UITapGestureRecognizer(
                target: self,
                action: #selector(didTappedChangeProfilePic))
            gesture.numberOfTapsRequired = 1
            gesture.numberOfTouchesRequired = 1
                imageProfile.addGestureRecognizer(gesture)
        }
    
    @objc private func didTappedChangeProfilePic(){
        print("tapped on imageView")
        presentPhotoActionSheet()
    }

        override func prepareForReuse() {
            super.prepareForReuse()
            
            imageProfile?.image = nil
        }
    }


extension ParentsImageCell :  UIImagePickerControllerDelegate ,UINavigationControllerDelegate {
    
    func presentPhotoActionSheet(){
        let actionSheet = UIAlertController(title: "Profile Picture", message: "How would you write to select a picture", preferredStyle: .actionSheet)
        actionSheet.addAction(UIAlertAction(title: "cancel", style: .cancel, handler: nil))
        actionSheet.addAction(UIAlertAction(title: "Take Photo", style: .default, handler: {[weak self] _ in
            self?.presentCamera()
        }))
        actionSheet.addAction(UIAlertAction(title: "Choose Photo", style: .default, handler: { [weak self]_ in
            self?.presentPhotoPicker()
        }))
        
        myVC?.present(actionSheet , animated: true)
        
    }
    func presentCamera(){
        let vc = UIImagePickerController()
        vc.sourceType = .camera
        vc.delegate = self
        vc.allowsEditing = true
        
        myVC?.present(vc , animated:  true)
        
    }
    func presentPhotoPicker(){
        let vc = UIImagePickerController()
        vc.sourceType = .photoLibrary
        vc.delegate = self
        vc.allowsEditing = true
       
            myVC?.present(vc , animated:  true)
        
    }
    
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info:
        [UIImagePickerController.InfoKey : Any]) {
        guard let selectedImage = info[UIImagePickerController.InfoKey.editedImage] as? UIImage else {
            return
        }
        self.imageProfile.image = selectedImage
    }
    
    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        picker.dismiss(animated: true, completion: nil)
    }
}
   
视图模型

Here I Try MVVM pattern to achieve TableView but for showing alert I face problems , it compiles successfully but not showing alert.
import Foundation
import UIKit

class ParentsImageCell : UITableViewCell {
    weak var myVC : ProfileOfParentsDetailsViewController?
    var parentProfileVC = ProfileOfParentsDetailsViewController()
    
    @IBOutlet weak var imageProfile : UIImageView!
    var items : ParentProfileViewModelItem? {
        didSet {
            guard let items = items as? ParentProfileViewModelProfileItem else {
                return
            }
            imageProfile?.image = UIImage(named: items.profileImg)

        }
    }
    
     static var nib:UINib {
            return UINib(nibName: identifier, bundle: nil)
        }
        
        static var identifier: String {
            return String(describing: self)
        }
        
        override func awakeFromNib() {
            super.awakeFromNib()
            
            imageProfile?.layer.cornerRadius = 62
            imageProfile?.clipsToBounds = true
            imageProfile?.contentMode = .scaleAspectFill
            imageProfile?.backgroundColor = UIColor.lightGray
            //Add Tapped Gesture
            imageProfile.isUserInteractionEnabled = true
            
            let gesture = UITapGestureRecognizer(
                target: self,
                action: #selector(didTappedChangeProfilePic))
            gesture.numberOfTapsRequired = 1
            gesture.numberOfTouchesRequired = 1
                imageProfile.addGestureRecognizer(gesture)
        }
    
    @objc private func didTappedChangeProfilePic(){
        print("tapped on imageView")
        presentPhotoActionSheet()
    }

        override func prepareForReuse() {
            super.prepareForReuse()
            
            imageProfile?.image = nil
        }
    }


extension ParentsImageCell :  UIImagePickerControllerDelegate ,UINavigationControllerDelegate {
    
    func presentPhotoActionSheet(){
        let actionSheet = UIAlertController(title: "Profile Picture", message: "How would you write to select a picture", preferredStyle: .actionSheet)
        actionSheet.addAction(UIAlertAction(title: "cancel", style: .cancel, handler: nil))
        actionSheet.addAction(UIAlertAction(title: "Take Photo", style: .default, handler: {[weak self] _ in
            self?.presentCamera()
        }))
        actionSheet.addAction(UIAlertAction(title: "Choose Photo", style: .default, handler: { [weak self]_ in
            self?.presentPhotoPicker()
        }))
        
        myVC?.present(actionSheet , animated: true)
        
    }
    func presentCamera(){
        let vc = UIImagePickerController()
        vc.sourceType = .camera
        vc.delegate = self
        vc.allowsEditing = true
        
        myVC?.present(vc , animated:  true)
        
    }
    func presentPhotoPicker(){
        let vc = UIImagePickerController()
        vc.sourceType = .photoLibrary
        vc.delegate = self
        vc.allowsEditing = true
       
            myVC?.present(vc , animated:  true)
        
    }
    
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info:
        [UIImagePickerController.InfoKey : Any]) {
        guard let selectedImage = info[UIImagePickerController.InfoKey.editedImage] as? UIImage else {
            return
        }
        self.imageProfile.image = selectedImage
    }
    
    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        picker.dismiss(animated: true, completion: nil)
    }
}
   
视图控制器

class ParentProfileViewModel: NSObject {
    var items = [ParentProfileViewModelItem]()
    
    var reloadSections: ((_ section: Int) -> Void)?
    
    override init() {
        super.init()
        guard let data = dataFromFile("ServerData"),
            let profile = Profile(data: data) else {
                return
        }

        // initialization code will go here
        
        if let profile = profile.pictureUrl {
            let profileItem = ParentProfileViewModelProfileItem(profileImg: profile)
            items.append(profileItem)
        }
        
        if let name = profile.fullName {
            let nameItem = ParentProfileViewModelNameItem(name: name)
            items.append(nameItem)
        }
        
        if let email = profile.email {
            let emailItem = ParentProfileViewModelEmailItem(email: email)
            items.append(emailItem)
        }
        
        
        let coach = profile.coach
        
        if !coach.isEmpty {
            let coachItem = ParentProfileViewModelCoachItem(coach: coach)
            items.append(coachItem)
        }
        
        let candidate = profile.candidate
        
        if !candidate.isEmpty {
            let candidateItem = ParentProfileViewModelCandidateItem(candidate: candidate)
            items.append(candidateItem)
        }
    }
}

//MARK:- TableviewDatasource & Delegates
extension ParentProfileViewModel: UITableViewDataSource {
    //Number of section
    func numberOfSections(in tableView: UITableView) -> Int {
        return items.count
    }
    //Number of RowInSection
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        
        let item = items[section]
        guard item.isCollapsible else {
            return item.rowCount
        }
        
        if item.isCollapsed {
            return 0
        } else {
            return item.rowCount
        }
    }
    
    
    //Cell for row at indexpath
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        // we will configure the cells here
        let item = items[indexPath.section]
        switch item.type {
        case .profileImg:

            let vc = ProfileOfParentsDetailsViewController()
            if let cell = tableView.dequeueReusableCell(withIdentifier: ParentsImageCell.identifier, for: indexPath) as? ParentsImageCell {

                cell.items = item
                cell.myVC = vc
                return cell
            }
        case .fullName:
            if let cell = tableView.dequeueReusableCell(withIdentifier: ParentsFulNameCell.identifier, for: indexPath) as? ParentsFulNameCell {
                cell.items = item
                return cell
            }
        case .email:
            if let cell = tableView.dequeueReusableCell(withIdentifier: ParentsEmailCell.identifier, for: indexPath) as? ParentsEmailCell {
                cell.items = item
                return cell
            }
        case .candidate:
            if let item = item as? ParentProfileViewModelCandidateItem, let cell = tableView.dequeueReusableCell(withIdentifier: CandidatCell.identifier, for: indexPath) as? CandidatCell {
                let candidate = item.candidate[indexPath.row]
                cell.item = candidate
                return cell
            }
        case .coach:
            if let item = item as? ParentProfileViewModelCoachItem, let cell = tableView.dequeueReusableCell(withIdentifier: ParentCoachCell.identifier, for: indexPath) as? ParentCoachCell {
                cell.item = item.coach[indexPath.row]
                return cell
            }
        }
        return UITableViewCell()
        
    }
}
我试图得到通知,但我失败了,并对我的MVVM方法发表了评论 我尝试在VM中调用tableview数据源和委托 我试图得到通知,但我失败了,并对我的MVVM方法发表了评论 我尝试在VM中调用tableview数据源和委托