Я пытаюсь назначить изображение (которое находится в UIViewController) UIImageView (которое находится в UITableViewCell), когда камера закрывается. Проблема в том, что я не могу получить доступ к своему UIViewController из Cell в той функции, где мне это нужно. Где мне нужно установить свой UIImageView, чтобы иметь доступ к нему в моей функции из UIViewController?
Я уже пытался использовать метод делегата, чтобы передать свой UIImageView в UIViewController, а после этого вызвать этот метод делегата и назначить изображение. Но не работает по некоторым причинам.
Вот мой код из UITableViewCell:
protocol DefectAndDamageCellDelegate {
func receiveImageViewFromCell(imageView: UIImageView)
}
class DefectAndDamageCheckCell: UITableViewCell {
// Interface Links
@IBOutlet weak var defectImageView: UIImageView!
// Properties
var delegate: DefectAndDamageCellDelegate?
override func awakeFromNib() {
super.awakeFromNib()
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
}
func configCell(){
delegate?.receiveImageViewFromCell(imageView: defectImageView)
}
}
Вот мой код из UIViewController:
extension DefectAndDamageCheckVC: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 2
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: Constants.defectAndDamageCell, for: indexPath) as! DefectAndDamageCheckCell
cell.configCell()
cell.delegate = self
return cell
}
}
extension DefectAndDamageCheckVC: DefectAndDamageCellDelegate{
func receiveImageViewFromCell(imageView: UIImageView) {
print("Image loaded")
}
}
extension DefectAndDamageCheckVC: UINavigationControllerDelegate, UIImagePickerControllerDelegate {
// Open camera when the user hold on a cell and choose Camera.
func showCamera() {
self.imagePicker = UIImagePickerController()
self.imagePicker.delegate = self
self.imagePicker.sourceType = .camera
present(self.imagePicker, animated: true, completion: nil)
}
//Dismiss the Camera and display the selected image into the UIImageView
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]){
imagePicker.dismiss(animated: true, completion: nil)
guard let selectedImage = info[.originalImage] as? UIImage else {
print("Image not found!")
return
}
// How can I access the imageView from my Cell here ?
//myImageViewFromCell.image = selectedImage // issue here
// This delegate don't work for some reasons. When I debug I can see the image on 'selectedImage' but is not assigned to my UIImageView
receiveImageViewFromCell(imageView: UIImageView(image: selectedImage))
}
}
Вот небольшой пример GitHub с моей проблемой. Для доступа к камере нужно удерживать тап на ячейке. https://github.com/tygruletz/sendDataFromCellToController/
Спасибо !





Весь смысл в том, чтобы иметь какой-то массив источников данных
var images = [UIImage]()
который объявляет, сколько ячеек имеет ваше табличное представление
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return images.count
}
Затем с этим источником данных вы можете сказать что-то вроде, если это ячейка в этом IndexPath установите это изображение. Для этого вы можете легко получить доступ к UIImageView определенной ячейки в cellForRowAt, вам не нужен протокол делегата
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: Constants.defectAndDamageCell, for: indexPath) as! DefectAndDamageCheckCell
cell.defectImageView.image = images[indexPath.row]
return cell
}
Итак, когда изображение выбрано UIImagePickerController, измените источник данных для вашего табличного представления (добавьте это новое изображение), а затем вставьте новую строку в табличное представление.
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]){
imagePicker.dismiss(animated: true, completion: nil)
guard let selectedImage = info[.originalImage] as? UIImage else {
print("Image not found!")
return
}
images.append(selectedImage)
tableView.insertRows(at: [IndexPath(row: images.count - 1, section: 0)], with: .automatic)
}
Я реализую то, что вы сказали мне, но теперь сокрушается в этой строке с этой ошибкой: cell.defectImageView.image = images[indexPath.row] // Неустранимая ошибка: индекс вне диапазона
@Flo не забудьте изменить numberOfRowsInSection метод источника данных, чтобы он возвращал количество элементов внутри images массива.
Я сделал и все еще терпит крах в том же самом месте.
@Flo, когда ты получаешь эту ошибку? Когда вы запускаете свое приложение?
Да Роберт. Когда я запускаю, мое приложение падает.
возможно ли найти решение, не завися от всего моего приложения на images.count? Потому что там у меня в ячейке много компонентов и я открываю камеру с помощью TapGesture на ячейке.
@Flo на самом деле, у вас может быть массив необязательных изображений с надписью [UIImage(), nil, UIImage(), nil, nil и т. д.], или у вас могут быть изображения по умолчанию, или у вас может быть пользовательская модель со свойством изображения, ...
Извините, что беспокою вас, но я создал небольшой пример GitHub со своей проблемой, который точно отражает мою проблему в моем проекте. Как вы думаете, вы можете взглянуть на него? Спасибо.
Такое ощущение, что вы двигаетесь по цепи... от Селлфорров к configCell, и здесь вы вызвали делегатов, которые возвращаются к
DefectAndDamageCheckVC.