在每个表格视图单元格中使用 UIImagePickerController
Using UIImagePickerController in each tableview cell
我正在尝试构建一个具有食谱上传功能的食谱应用程序。在 PostController 中,将有一个包含所有烹饪步骤的 tableview,每个都在一个 tableview 单元格中。在cell中会有一个描述的textfield和一个上传图片的UIImageView(从pickerController中选择的图片会显示在这个UIImageView中以备后用上传)。我正在尝试做
imageViewInCell.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleImageUpload)))
调用生成 UIImagePickerController 的 handleImageUpload()
函数。但是这样做,我遇到了两个问题。
- 我无法通过
UITapGestureRecognizer
中的选择器获取单元格的 index.row
值,没有索引我无法将所选图像分配回单元格的 UIImageView。
即使我在 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)
}
您可以在 cellForRowAtIndexPath 中将 indexPath.row 设置为图像视图的标签,如下所示
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
我假设您希望 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)
}
我来晚了,但下面的代码应该可以工作。
我会让 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])
处理图像。
我正在尝试构建一个具有食谱上传功能的食谱应用程序。在 PostController 中,将有一个包含所有烹饪步骤的 tableview,每个都在一个 tableview 单元格中。在cell中会有一个描述的textfield和一个上传图片的UIImageView(从pickerController中选择的图片会显示在这个UIImageView中以备后用上传)。我正在尝试做
imageViewInCell.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleImageUpload)))
调用生成 UIImagePickerController 的 handleImageUpload()
函数。但是这样做,我遇到了两个问题。
- 我无法通过
UITapGestureRecognizer
中的选择器获取单元格的index.row
值,没有索引我无法将所选图像分配回单元格的 UIImageView。 即使我在 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) }
您可以在 cellForRowAtIndexPath 中将 indexPath.row 设置为图像视图的标签,如下所示
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
我假设您希望 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)
}
我来晚了,但下面的代码应该可以工作。
我会让 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])
处理图像。