Ios 在每个tableview单元格中使用UIImagePickerController

Ios 在每个tableview单元格中使用UIImagePickerController,ios,swift,uitableview,uiimagepickercontroller,Ios,Swift,Uitableview,Uiimagepickercontroller,我正试图建立一个配方应用程序与配方上传功能。在后置控制器中,将有一个所有烹饪步骤的tableview,每个步骤位于tableview单元格中。在单元格中,将有一个描述的文本字段,以及一个用于图片上传的UIImageView(从pickerController中选择的图片将显示在此UIImageView中,以便稍后上传)。我正在努力 imageViewInCell.AddgestureRecognitizer(UITapsgestureRecognitizer(目标:self,操作:#选择器(ha

我正试图建立一个配方应用程序与配方上传功能。在后置控制器中,将有一个所有烹饪步骤的tableview,每个步骤位于tableview单元格中。在单元格中,将有一个描述的文本字段,以及一个用于图片上传的UIImageView(从pickerController中选择的图片将显示在此UIImageView中,以便稍后上传)。我正在努力
imageViewInCell.AddgestureRecognitizer(UITapsgestureRecognitizer(目标:self,操作:#选择器(handleImageUpload)))
调用生成UIImagePickerController的
handleImageUpload()
函数。但这样做,我遇到了两个问题

  • 我无法通过
    UICapgestureRecognitizer
    中的选择器获取单元格的
    索引.行
    值,没有索引,我无法将所选图像分配回单元格的UIImageView
  • 即使我在handleImageUpload中获得index.row,我仍然需要下面的函数来分配所选图像。此函数如何接受my参数并找到相应的imageViewInCell

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        if let selectedImage: UIImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
             imageViewInCell.image = selectedImage
        }
        dismiss(animated: true, completion: nil)
    }
    

  • 您可以在cellForRowAtIndexPath中将indexPath.row设置为imageview的标记,如下所示

    cell.yourImageView.tag = indexPath.row
    
    然后您可以使用下面的方法再次获取此indepath

      let indexPath = NSIndexPath(forRow: sender.tag, inSection: 0)
    let cell = tableView.cellForRowAtIndexPath(indexPath) as! yourcellClass!
    cell.yourImgeView.image = selectedImage
    

    我假设您希望仅在点击
    imageView
    时调用
    handleimageupload()
    ,而不是整个单元格,因此您使用的是tap手势

    现在要回答您的问题,请将标记指定给imageView,如下所示:

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
    {
    //cell configuration
    cell.imageView.tag = indexPath.row
    return cell
    }
    
    您可以将选定图像指定给选定单元格,如下所示:

    现在您的
    handleImageUpload()
    是:

    func handleImageUpload(_ sender: UITapGestureRecognizer){
    selectedIndexPath = sender.tag
    }
    
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        if let selectedImage: UIImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
                let cell = self.tableView.cellForRowAtIndexPath(selectedIndexPath) as UITableViewCell
                cell.imageViewInCell.image = selectedImage
        }
        dismiss(animated: true, completion: nil)
    }
    

    我去派对已经很晚了,但下面的代码应该可以用

    我会让UITableViewCell处理图像。将其设置为UIPickerControllerDelegate,并在必要时保持闭包以显示选择器(因为它本身不是视图控制器,所以无法显示某些内容)

    比如:

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let photoCell = tableView.dequeueReusableCell(withIdentifier: "PhotosTableViewCell", for: indexPath) as! PhotosTableViewCell
        photoCell.takePicture = {[weak self] in
                    let imagePicker =  UIImagePickerController()
                    imagePicker.delegate = photoCell
                    imagePicker.sourceType = .camera
                    self?.present(imagePicker, animated: true, completion: nil)
                }
    
    让您的UITableviewCell实现:

    var takePicture: (() -> Void)?
    
    保持关闭。然后通过按钮或其他方式调用它,使其触发。 使用:


    处理图像。

    为什么要使用点击手势而不是didSelectRowAtIndexPath?我为imageView添加了UITap手势,因为此操作仅与图片相关。使用didSelectRowAtIndexPath可能不是选择,因为单元格中也有一个文本字段。最后,我使用全局变量
    selectedIndex
    (由
    didFinishPickingMediaWithInfo
    使用)和
    cell.imageViewInCell.tag
    (由
    handleImageUpload()
    使用)保存了索引,每次调用
    handleImageUpload()
    时,它都会将
    selectedIndex
    赋值为cell.imageViewInCell.tag。在
    didFinishPickingMediaWithInfo
    中,需要使用全局变量来查找相应的单元格。使用手势方法,您只能传递GestureRecognitor对象,而不能传递任何其他内容。编辑答案。这很有帮助,但前面也回答了类似的问题,因此我接受这个想法。非常感谢你!这个想法很有帮助。问题现在已经解决了,谢谢!
     func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])