У меня есть collectionView, который я заполняю, используя массив, который я создал в классе.CollectionView работает, но проблема в том, что когда я хочу перейти к другому viewController, используя кнопку в collectionViewCell, а также проанализировать конкретные данные из этой ячейки в viewController.
Пример того, что я пытаюсь сделать, - это если я нажимаю кнопку в ячейке для изображения вопроса, я хочу перейти к следующему viewController и хочу, чтобы изображение этого viewController было изображением вопроса, и, возможно,В будущем я добавлю некоторые другие соответствующие ему данные.
Я посмотрел другие ответы на этом и других сайтах, которые позволили мне зайти так далеко, но я ничего не могу найти, чтобы решить эту проблемуCollectionView.Я знаю, что он похож на tableView, но когда я пытаюсь изменить его на основе tableView, но он, похоже, не работает для меня.
Это изображение того, что первое и второе представлениявыглядит как
Это класс, который я создал:
import Foundation
import UIKit
class Information {
var image = ""
var button = ""
var infoOne = ""
var infoTwo = ""
var price = ""
init(image: String, button: String, infoOne: String, infoTwo: String, price: String) {
self.image = image
self.button = button
self.infoOne = infoOne
self.infoTwo = infoTwo
self.price = price
}
//MARK: Carousel Data
static func createData() -> [Information] {
return [
Information(image: "question", button: "Buy One", infoOne: "First Data", infoTwo: "Second Data", price: "10"),
Information(image: "exclamation", button: "Buy Two", infoOne: "First Data", infoTwo: "Second Data", price: "20"),
Information(image: "period", button: "Buy Three", infoOne: "First Data", infoTwo: "Second Data", price: "30"),
Information(image: "all", button: "Buy Four", infoOne: "First Data", infoTwo: "Second Data", price: "40")
]
}
}
Этот массив прекрасно работает, когда он заполняет collectionViewCell.
Это collectionViewCell
import UIKit
class InfoCollectionViewCell: UICollectionViewCell {
var infomation: Information! {
didSet {
updateUI()
}
}
var addBtnAction : (()-> ())?
@IBOutlet weak var infoImage: UIImageView!
@IBOutlet weak var infoLblOne: UILabel!
@IBOutlet weak var infoLblTwo: UILabel!
@IBOutlet weak var priceLbl: UILabel!
@IBOutlet weak var buyBtn: UIButton!
fileprivate func updateUI() {
infoImage.image! = UIImage(named: infomation.image)!
infoLblOne.text = infomation.infoOne
infoLblTwo.text = infomation.infoTwo
priceLbl.text = infomation.price
buyBtn.setTitle(infomation.button, for: .normal)
}
@IBAction func buyBtnPressed(_ sender: Any) {
print("INFORMATION: \(infomation.image)")
addBtnAction?()
}
override func layoutSubviews() {
super.layoutSubviews()
self.layer.cornerRadius = 5.0
self.clipsToBounds = true
}
}
это viewController:
import UIKit
class ViewController: UIViewController {
let collectionViewCellId: String = "carouselCollectionCell"
@IBOutlet weak var collectionView: UICollectionView!
fileprivate var information = Information.createData()
override func viewDidLoad() {
super.viewDidLoad()
self.collectionView.delegate = self
}
}
extension ViewController: UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
func numberOfSections(in collectionView: UICollectionView) -> Int {
return 1
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return information.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "infoCell", for: indexPath) as! InfoCollectionViewCell
cell.addBtnAction = {
self.performSegue(withIdentifier: "mainSegue", sender: self)
}
cell.infomation = self.information[indexPath.item]
return cell
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "mainSegue" {
let nxtVC = segue.destination as? DetailViewController
let cell = sender as! InfoCollectionViewCell
let myIndexPath = self.collectionView.indexPath(for: cell)
nxtVC?.infomation = information[(myIndexPath?.item)!]
}
}
}
Так что когдаЯ запускаю приложение, все в порядке, пока я не нажму кнопку, чтобы перейти и проанализировать данные.Приложение аварийно завершает работу, и причина в этом:
Это то, что находится в консоли вывода:
Не удалось привести значение типа'carousel.ViewController' (0x107992178) в 'carousel.InfoCollectionViewCell' (0x107991f98).2018-09-28 21: 22: 52.116698-0400 карусель [1573: 38999] Не удалось преобразовать значение типа 'carousel.ViewController' (0x107992178) в 'carousel.InfoCollectionViewCell' (0x107991f98).(lldb)
Я бы предпочел оставить кнопку, если это вообще возможно, но если это невозможно, я это поменяю.Я не уверен, что я делаю неправильно.Если есть что-то еще, с чем я могу помочь, пожалуйста, дайте мне знать.Большое спасибо.
РЕДАКТИРОВАТЬ:
Кажется, что я забыл включить один из важных представлений, один для другого viewController, который используется.
Поток 1: Неустранимая ошибка: неожиданно обнаружен ноль при развертывании Необязательное значение
Это представление, к которому я обращаюсь:
import UIKit
class DetailViewController: UIViewController {
@IBOutlet weak var infoImage: UIImageView!
@IBOutlet weak var dataTxtView: UITextView!
var testingImage: UIImage = UIImage()
var infomation: Information! {
didSet {
updateUI()
}
}
override func viewDidLoad() {
super.viewDidLoad()
}
fileprivate func updateUI() {
let images = UIImage(named: infomation.image)
infoImage.image = images
print("Image: \(infomation.image)")
}
}
В функции updateUI, которую я пыталсясделать infoImage таким же, как infomation.image, но он аварийно завершает работу и сообщает:
Поток 1: фатальная ошибка: неожиданно обнаружен ноль при развертывании необязательного значения
Это не имеет особого смысла дляменя, потому что я пытался напечатать, что такое строка infomation.image, и это сработало, но в тот момент, когда я пытаюсь представить его как изображение, оно, похоже, вылетает.Еще раз спасибо
РЕДАКТИРОВАТЬ2:
Я понял, что я делал не так.Кажется, я всегда пытался использовать необязательную строку.Как я это исправил, так это то, что я изменил класс, который я сделал, и вместо строки и превратил его в изображение, это уже изображение.Я также попытался создать оператор if let для удаления необязательного.
Вот так выглядит prepareForSegue в главном ViewController
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "mainSegue" {
let nxtVC = segue.destination as? DetailViewController
let cell = sender as? InfoCollectionViewCell
let myIndexPath = self.collectionView.indexPath(for: cell!)
if let indexPath = myIndexPath {
nxtVC?.infomation = information[indexPath.row]
}
}
}
Вот так выглядит viewDidLoad:
override func viewDidLoad() {
super.viewDidLoad()
print("***********TESTINGIMAGE: \(infomation.image!)***********")
infoImage.image = infomation.image!
}
Я знаю, что я разворачиваю изображение с!но я не знаю, как удалить необязательное в противном случае.Спасибо за помощь.