Разбор данных из ячейки коллекционного вида в новый viewController с помощью кнопки в CollectionViewCell - PullRequest
0 голосов
/ 29 сентября 2018

У меня есть collectionView, который я заполняю, используя массив, который я создал в классе.CollectionView работает, но проблема в том, что когда я хочу перейти к другому viewController, используя кнопку в collectionViewCell, а также проанализировать конкретные данные из этой ячейки в viewController.

Пример того, что я пытаюсь сделать, - это если я нажимаю кнопку в ячейке для изображения вопроса, я хочу перейти к следующему viewController и хочу, чтобы изображение этого viewController было изображением вопроса, и, возможно,В будущем я добавлю некоторые другие соответствующие ему данные.

Я посмотрел другие ответы на этом и других сайтах, которые позволили мне зайти так далеко, но я ничего не могу найти, чтобы решить эту проблемуCollectionView.Я знаю, что он похож на tableView, но когда я пытаюсь изменить его на основе tableView, но он, похоже, не работает для меня.

Это изображение того, что первое и второе представлениявыглядит как

This is the opening View and where the collectionview and cell is

This is the view I want to parse the data to

Это класс, который я создал:

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!

}

Я знаю, что я разворачиваю изображение с!но я не знаю, как удалить необязательное в противном случае.Спасибо за помощь.

1 Ответ

0 голосов
/ 29 сентября 2018

Проблема в том, что вы предполагаете, что sender в prepare является экземпляром ячейки, но ваш вызов performSegue передает self в качестве отправителя.Но self в этом случае является контроллером представления, а не ячейкой.

Решение состоит в том, чтобы передать ячейку вместо self.

cell.addBtnAction = {
    self.performSegue(withIdentifier: "mainSegue", sender: cell)
}
...