Ios 在每个tableview单元格中使用UIImagePickerController
我正试图建立一个配方应用程序与配方上传功能。在后置控制器中,将有一个所有烹饪步骤的tableview,每个步骤位于tableview单元格中。在单元格中,将有一个描述的文本字段,以及一个用于图片上传的UIImageView(从pickerController中选择的图片将显示在此UIImageView中,以便稍后上传)。我正在努力Ios 在每个tableview单元格中使用UIImagePickerController,ios,swift,uitableview,uiimagepickercontroller,Ios,Swift,Uitableview,Uiimagepickercontroller,我正试图建立一个配方应用程序与配方上传功能。在后置控制器中,将有一个所有烹饪步骤的tableview,每个步骤位于tableview单元格中。在单元格中,将有一个描述的文本字段,以及一个用于图片上传的UIImageView(从pickerController中选择的图片将显示在此UIImageView中,以便稍后上传)。我正在努力 imageViewInCell.AddgestureRecognitizer(UITapsgestureRecognitizer(目标:self,操作:#选择器(ha
imageViewInCell.AddgestureRecognitizer(UITapsgestureRecognitizer(目标:self,操作:#选择器(handleImageUpload)))
调用生成UIImagePickerController的handleImageUpload()
函数。但这样做,我遇到了两个问题
UICapgestureRecognitizer
中的选择器获取单元格的索引.行
值,没有索引,我无法将所选图像分配回单元格的UIImageViewfunc 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])