Swift 5: Как отобразить текст в UILabel на втором экране при переходе с превью картинки которая без него на первом экране?

Уважаемые коллеги, всем добрый день! Помогите пожалуйста, добрым советом. Я начинающий разработчик в Swift, и сейчас учусь самостоятельно понимать как работают ViewControllers и передача данных в них.

Суть вопроса такова.. Приложение делается на UICollections.

Логика приложения: (приложение без Базы данных) Два основных простеньких скрина. Один скрин - картинки фотографий пользователя квадратиками (в виде плиток). И второй скрин - увеличенная картинка с ее названием под ней, - появляется при нажатии на квадратик фотографии на первом скрине.

Результат который получился у меня: на первом скрине все показывает хорошо. На втором скрине Заголовка в UI Label нет так как я не умею/не знаю каким кодом его зацепить с картинки и вывести на второй экран. (самого заголовка картинки на первом скрине под плитками не должно быть. Он есть только в массиве названий в файле программы).Я вывела заголовок текущей картинки но в консоли. Помогите пожалуйста, понять, как вывести заголовок в UILabel на второй скрин.

Заранее благодарю Вас и буду очень признательна. :)

Скриншот прикрепляю ниже. Ссылка на проект на github вот тут https://github.com/ViJane-dev/UI_Kit_iOS-Apps/tree/FavouritePictures

Фотография приложения где нужно отобразить название картинки в UILabel при клике на превью на первом скрине

Вот тут код главных контроллеров которые формируют весь внешний вид приложения:

PreviewPage.Swift

import UIKit

private let reuseIdentifier = "FavouritePictures"

class PreviewPage: UICollectionViewController {

    var imageNameArray = [
        "Ван Гог - Звездная Ночь",
        "Ван Гог - Подсолнухи",
        "ДаВинчи - Тайная Вечеря",
        "Казимир Малевич - Черный Квадрат",
        "Рафаэль - Донна Велата",
        "Рафаэль - Сикстинская Мадонна",
        "Сальвадор Дали - Постоянство Памяти",
        "Сандро Ботичелли - Афродита",
        "Шишкин - Утро в сосновом бору",
        "Ян Вермеер - Девушка с жемчужной сережкой"
    ]
    

    
    override func viewDidLoad() {
        super.viewDidLoad()
        
    }

    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using [segue destinationViewController].
        // Pass the selected object to the new view controller.
    }
    */

    // MARK: UICollectionViewDataSource

    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return imageNameArray.count
    }

    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! FavouritePicturesCell
        
        let imageName = imageNameArray[indexPath.item]
        let pictureImage = UIImage(named: imageName)
        cell.favouritePicturesImageView.image = pictureImage

        // 02092021
        let titleImage = imageNameArray[indexPath.row]
        cell.favouritePicturesImageView.image = UIImage(named: titleImage)
        // 02092021
        
        
        // -- еще одна поытка вывести название картинки
        //let imageTitle = imageNameArray[indexPath.item]
        //let titleSection = UIImage(named: imageTitle)

    
        return cell
    }
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "ShowPicture" {
            
            // старт --- вывод картинки на втором екране
            let showPictureVC = segue.destination as! ShowPictureVC
            let cell = sender as! FavouritePicturesCell
            showPictureVC.imageSave = cell.favouritePicturesImageView.image
            // конец --- вывод картинки на втором екране
            
            
            //showPictureVC.pictureTitle = cell.favouritePicturesImageView.image?.description  --еще одна попытка вывести название
            
            //if let indexPath = self.collectionView.indexPathsForSelectedItems {
                
                // ------- не понимаю как взять заголовок с картинки и вывести его на втором скрине в качестве названия картины --------
                
                //let imageTitle = showPictureVC.pictureTitle
                //showPictureVC.pictureTitle = imageTitle
                
                //let imageTitle = imageNameArray[indexPath.count - 1]
                // let imageTitle = imageNameArray[indexPath.item]
                //showPictureVC.pictureTitle = imageTitle
                
                //showPictureVC.titleLabelShowPictureVC = imageNameArray[indexPath.item]
            //}
            
        }
    }
    
    // 02092021 -- сейчас в даннный момент выводит заголовок текущей выбранной картины в консоль Xcode.Выводит не рандомное название а именно выбранной картины. НО в консоли.
    override public func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        
       let imageNameSelected = imageNameArray[indexPath.row]
        
       print(imageNameSelected)
    }
    // 02092021
    
    
    //--- Нужно все-таки сделать так чтобы оно наконец-то вывело заголовок на втором екране под текущей выбранной картинкой и имено от то картинки которая выбрана на екране (не рандомное название); -----//
}

FavouritePictureCell.swift

import UIKit

class FavouritePicturesCell: UICollectionViewCell {
    
    @IBOutlet weak var favouritePicturesImageView: UIImageView!
}

ShowPictureVC.swift

import UIKit

class ShowPictureVC: UIViewController {

    
    @IBOutlet weak var imageViewShowPictureVC: UIImageView!
    
    @IBOutlet weak var titleLabelShowPictureVC: UILabel!
    
    var imageSave: UIImage?
    
    var pictureTitle: String?
    
    //var pictureTitle = ""
    
    override func viewDidLoad() {
        super.viewDidLoad()

        imageViewShowPictureVC.image = imageSave
        
        titleLabelShowPictureVC.text = pictureTitle
        titleLabelShowPictureVC.numberOfLines = 0
        
    }

}

Ответы (1 шт):

Автор решения: schmidt9

Можно сделать таким образом

  • добавить в ячейку свойство pictureTitle
class FavouritePicturesCell: UICollectionViewCell {
    
    @IBOutlet weak var favouritePicturesImageView: UIImageView!
    
    var pictureTitle = ""
}
  • При выводе коллекции установить это свойство и потом при выводе второго экрана брать значение оттуда
import UIKit

private let reuseIdentifier = "FavouritePictures"

class PreviewPage: UICollectionViewController {

    var imageNameArray = [
        "Ван Гог - Звездная Ночь",
        "Ван Гог - Подсолнухи",
        "ДаВинчи - Тайная Вечеря",
        "Казимир Малевич - Черный Квадрат",
        "Рафаэль - Донна Велата",
        "Рафаэль - Сикстинская Мадонна",
        "Сальвадор Дали - Постоянство Памяти",
        "Сандро Ботичелли - Афродита",
        "Шишкин - Утро в сосновом бору",
        "Ян Вермеер - Девушка с жемчужной сережкой"
    ]

    // MARK: UICollectionViewDataSource

    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return imageNameArray.count
    }

    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! FavouritePicturesCell
        
        let imageName = imageNameArray[indexPath.row]
        cell.favouritePicturesImageView.image = UIImage(named: imageName)
        cell.pictureTitle = imageName // -- 1
        
        return cell
    }
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "ShowPicture" {
            let showPictureVC = segue.destination as! ShowPictureVC
            let cell = sender as! FavouritePicturesCell
            showPictureVC.imageSave = cell.favouritePicturesImageView.image
            showPictureVC.pictureTitle = cell.pictureTitle // -- 2
        }
    }

}

→ Ссылка