在每个tableview单元格中使用UIImagePickerController

时间:2016-11-30 07:03:30

标签: ios swift uitableview uiimagepickercontroller

我正在尝试使用食谱上传功能构建配方应用。在PostController中,所有烹饪步骤都有 tableview ,每个步骤都在tableview单元格中。在单元格中将有一个 textfield 描述和一个 UIImageView 用于图片上传(从pickerController中选择的图片将显示在此UIImageView中以供稍后上传)。我试着去做 imageViewInCell.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleImageUpload))) 调用生成UIImagePickerController的handleImageUpload()函数。但通过这样做,我遇到了两个问题。

  1. 我无法通过index.row中的选择器获取单元格的UITapGestureRecognizer值,而索引我无法将所选图像分配回单元格的UIImageView。
  2. 即使我在handleImageUpload中得到了index.row,我仍然需要下面的函数来分配所选的图像。该函数如何接受我的参数并找到相应的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)
    }
    

3 个答案:

答案 0 :(得分:1)

你可以将indexPath.row设置为cellForRowAtIndexPath中imageview的标记,如下面

cell.yourImageView.tag = indexPath.row

然后你可以使用下面的

来获得这个defpath
  let indexPath = NSIndexPath(forRow: sender.tag, inSection: 0)
let cell = tableView.cellForRowAtIndexPath(indexPath) as! yourcellClass!
cell.yourImgeView.image = selectedImage

答案 1 :(得分:0)

我假设你只想在thehandleImageUpload()而不是整个单元格上调用imageView,因此你正在使用 tapGesture

现在回答您的问题,将标签分配给您的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)
}

答案 2 :(得分:0)

我参加聚会很晚,但是下面的代码应该可以工作。

我将让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)?

保持关闭。然后从按钮或其他东西调用它以使其触发。 使用:

 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])

处理图像。