Как получить доступ к UIImageView из UITableViewCell в пользовательской функции из UIViewController

Я пытаюсь назначить изображение (которое находится в 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/

Спасибо !

Такое ощущение, что вы двигаетесь по цепи... от Селлфорров к configCell, и здесь вы вызвали делегатов, которые возвращаются к DefectAndDamageCheckVC.

dahiya_boy 02.04.2019 12:05
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
277
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Весь смысл в том, чтобы иметь какой-то массив источников данных

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 02.04.2019 12:12

@Flo не забудьте изменить numberOfRowsInSection метод источника данных, чтобы он возвращал количество элементов внутри images массива.

Robert Dresler 02.04.2019 12:13

Я сделал и все еще терпит крах в том же самом месте.

Flo 02.04.2019 12:14

@Flo, когда ты получаешь эту ошибку? Когда вы запускаете свое приложение?

Robert Dresler 02.04.2019 12:16

Да Роберт. Когда я запускаю, мое приложение падает.

Flo 02.04.2019 12:17

возможно ли найти решение, не завися от всего моего приложения на images.count? Потому что там у меня в ячейке много компонентов и я открываю камеру с помощью TapGesture на ячейке.

Flo 02.04.2019 12:35

@Flo на самом деле, у вас может быть массив необязательных изображений с надписью [UIImage(), nil, UIImage(), nil, nil и т. д.], или у вас могут быть изображения по умолчанию, или у вас может быть пользовательская модель со свойством изображения, ...

Robert Dresler 02.04.2019 12:36

Извините, что беспокою вас, но я создал небольшой пример GitHub со своей проблемой, который точно отражает мою проблему в моем проекте. Как вы думаете, вы можете взглянуть на него? Спасибо.

Flo 02.04.2019 17:03

Другие вопросы по теме