Swift 5: Как отобразить текст в UILabel на втором экране при переходе с превью картинки которая без него на первом экране?
Уважаемые коллеги, всем добрый день! Помогите пожалуйста, добрым советом. Я начинающий разработчик в Swift, и сейчас учусь самостоятельно понимать как работают ViewControllers и передача данных в них.
Суть вопроса такова.. Приложение делается на UICollections.
Логика приложения: (приложение без Базы данных) Два основных простеньких скрина. Один скрин - картинки фотографий пользователя квадратиками (в виде плиток). И второй скрин - увеличенная картинка с ее названием под ней, - появляется при нажатии на квадратик фотографии на первом скрине.
Результат который получился у меня: на первом скрине все показывает хорошо. На втором скрине Заголовка в UI Label нет так как я не умею/не знаю каким кодом его зацепить с картинки и вывести на второй экран. (самого заголовка картинки на первом скрине под плитками не должно быть. Он есть только в массиве названий в файле программы).Я вывела заголовок текущей картинки но в консоли. Помогите пожалуйста, понять, как вывести заголовок в UILabel на второй скрин.
Заранее благодарю Вас и буду очень признательна. :)
Скриншот прикрепляю ниже. Ссылка на проект на github вот тут https://github.com/ViJane-dev/UI_Kit_iOS-Apps/tree/FavouritePictures
Вот тут код главных контроллеров которые формируют весь внешний вид приложения:
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 шт):
Можно сделать таким образом
- добавить в ячейку свойство
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
}
}
}
