Ios 如何在tableViewCell中运行imagePicker

Ios 如何在tableViewCell中运行imagePicker,ios,swift,uitableview,uiimagepickercontroller,Ios,Swift,Uitableview,Uiimagepickercontroller,我有一个带手机的桌面视图。在这个单元中,我有一个imageView和一个覆盖它的按钮。这个按钮有一个iAction。点击按钮时,该按钮应该会召唤图像选择器。iAction代码位于单元子视图中 @IBAction func MyStatusImageButtonAction(sender: AnyObject) { // Select Image let imagePicker = UIImagePickerController() imagePicker.delegate

我有一个带手机的桌面视图。在这个单元中,我有一个imageView和一个覆盖它的按钮。这个按钮有一个iAction。点击按钮时,该按钮应该会召唤图像选择器。iAction代码位于单元子视图中

@IBAction func MyStatusImageButtonAction(sender: AnyObject) {
    // Select Image
    let imagePicker = UIImagePickerController()
    imagePicker.delegate = self
    imagePicker.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
    imagePicker.allowsEditing = false
    self.presentViewController(imagePicker, animated: true, completion: nil)
因为这一行,我得到了一个错误

self.presentViewController(imagePicker, animated: true, completion: nil)
错误表示“myCell”类型的值没有成员“presentViewController”

我是不是应该在承载单元格的viewController中加载imagePicker,然后以某种方式将其传输到单元格?我是不是应该在单元格中加载带有不同代码的imagePicker?我这样做完全错了吗

为清楚起见,我的目标是让用户加载此TableViewController,并能够仅将图像分配给此单元格中的imageView


谢谢。

只有
viewController
可以显示另一个
viewController
。因此请使用:

self.view.presentViewController(imagePicker, animated: true, completion: nil)

编写一个协议,TableViewController将为您显示它

protocol ImagePickerDelegate {

    func pickImage()
}
在你的牢房里

var delegate : ImagePickerDelegate?

@IBAction func pickImage(sender: AnyObject) {

    delegate?.pickImage()
}
在tableViewController中

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("displayImage", forIndexPath: indexPath) as! ImageTableViewCell

    cell.delegate = self

    return cell
}

func pickImage() {

    let imagePicker = UIImagePickerController()
    imagePicker.delegate = self
    imagePicker.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
    imagePicker.allowsEditing = false
    self.presentViewController(imagePicker, animated: true, completion: nil)
}

func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) {

    dismissViewControllerAnimated(true, completion: nil)

    var cell = tableView.cellForRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 0)) as! ImageTableViewCell
    cell.displayImageView.image = image
}

希望对您有所帮助。

我在这里找到了一个非常全面的逐步答案

从“定义数据模型”开始


基本上,你在一个Swift文件中定义了你的数据。然后你在ViewController中设置了与ImageView相等的照片。然后仍然在ViewController代码中,你将新定义的照片指向你的单元格。我一直在解决这个问题。提供的链接非常全面。

只是@truongky的pos的后续内容为Swift 5更新了语法

正如他正确指出的,首先创建一个协议。您可以为协议创建一个扩展名为的新文件。然后插入OP识别的代码:

protocol ImagePickerDelegate {
    func pickImage() 
}

然后,在TableViewController中:

func pickImage() {
    let imagePicker = UIImagePickerController()
    imagePicker.delegate = self
    imagePicker.sourceType = UIImagePickerController.SourceType.photoLibrary
    imagePicker.allowsEditing = false
    self.present(imagePicker, animated: true, completion: nil)
}

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
        let cell:ImageCell = tableView.cellForRow(at: IndexPath(row: 0, section: 0)) as! ImageCell
        cell.customImage.image = image
    }

    picker.dismiss(animated: true, completion: nil)
}

此外,您可以修改自定义单元格以响应轻触手势识别器,如下所示:

var delegate : ImagePickerDelegate?

@IBOutlet weak var customImage: UIImageView!

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code

    addTapGestureRecognizer(for: customImage)
}

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state
}

func addTapGestureRecognizer(for view: UIImageView) {
    let tap = UITapGestureRecognizer(target: self, action: #selector(pickImage))
    tap.numberOfTapsRequired = 1
    view.isUserInteractionEnabled = true
    view.addGestureRecognizer(tap)
}

@objc func pickImage() {
    delegate?.pickImage()
}

希望这有帮助


Kudos ~

我在让它工作时遇到了问题,但一旦我添加了:
类NewUserTweetTableVC:UIViewController,ImagePickerDelegate
它工作了,但是表数据源也需要在imagepicker委托内更新,否则在可重用单元出列时,图像将消失,因为数据源没有图像。