Выберите ячейку в представлении коллекции для нового контроллера - PullRequest
0 голосов
/ 16 февраля 2019

Очень новый код и создание проекта программно.У меня полностью настроено представление коллекции, но я не могу понять, как указать конкретной ячейке перейти к новому представлению коллекции или подробному представлению.Очень смущен и расстроен.Кто-нибудь может мне помочь или, по крайней мере, указать мне правильное направление.пожалуйста, не обращайте внимания, ха-ха.

это мой главный контроллер View

import UIKit



class HomeController: UICollectionViewController, 
UICollectionViewDelegateFlowLayout {


    var Legends: [Legend] = {
    var select1 = Legend()
    select1.thumbnailImageName = "select1thumbnail"
    var select2 = Legend()
    select2.thumbnailImageName = "select2humbnail"

    return[select1, select2]        
}()

    override func viewDidLoad() {
    super.viewDidLoad()
    navigationItem.title = "Choose Selection"
    collectionView.backgroundView = UIImageView(image: UIImage(named: "backgroundlogo"))
    collectionView?.register(VideoCell.self, forCellWithReuseIdentifier: "cellId")
    collectionView.dataSource = self
    collectionView.delegate = self



    }

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

}
    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellId", for: indexPath) as! VideoCell

    cell.legend = Legends[indexPath.item]       
    return cell

}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    return CGSize(width:view.frame.height, height: 150)
    }

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
    return 0

}

override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    let select2VC = UIViewController()
    navigationController?.navigationBar.tintColor = UIColor.white
    navigationController?.pushViewController(select2VC, animated: true)

 print("selcected")


}

}

это файл swift, который у меня есть для представления моей коллекции

import UIKit



class VideoCell: UICollectionViewCell {

var legend: Legend? {
    didSet {
        thumbnailImageView.image = UIImage(named: (legend?.thumbnailImageName)!)

    }
}

override init(frame: CGRect) {
    super.init(frame: frame)
    setupViews()
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

let thumbnailImageView: UIImageView = {
    let imageView = UIImageView()
    imageView.backgroundColor = UIColor.darkGray
    imageView.image = UIImage(named:"bgcolor")
    imageView.contentMode = .scaleAspectFit
    imageView.clipsToBounds = true
    imageView.translatesAutoresizingMaskIntoConstraints = false
    return imageView
}()

func setupViews() {
    addSubview(thumbnailImageView)

    addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-16-[v0]-16-|", options: NSLayoutConstraint.FormatOptions(), metrics: nil, views: ["v0": thumbnailImageView]))
    addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-1-[v0]-0-|", options: NSLayoutConstraint.FormatOptions(), metrics: nil, views: ["v0": thumbnailImageView]))

}



}

в третьемфайл У меня есть только этот бит кода

import UIKit

    class Legend: NSObject {

    var thumbnailImageName: String?

}

нижний код контроллера основного вида выводит «выбранный», но он печатает его для каждой ячейки ... Я предполагаю, что каждая ячейка будет нуждаться в своей собственнойфайл viewController.swift?затем скажите эту ячейку в этот файл swift, чтобы показать содержимое ??спасибо за ваше время.

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

Если вы хотите проверить, что продаваемо нажата.Вы можете проверить, какой тип ячейки нажат:

if let cell = tableView.cellForRow(at: indexPath) as? VideoCell {
//check some property and go to new UIViewController or UICollectionViewController
//and transfer data 
}
0 голосов
/ 16 февраля 2019

Нет, вам не нужно создавать собственный файл viewController.swift для каждой ячейки.Вам просто нужно создать один экран подробной страницы (один DetailViewController.swift), и вам нужно передать детали выбранной ячейки с переменными, объявленными в контроллере подробного представления.

Как я сделал ЗДЕСЬ в демо-проекте с вашим кодом и результатом будет:

enter image description here

Что я сделал, я добавил detailViewController в раскадровку, а также добавил файл класса.и didSelectItemAt будет выглядеть следующим образом:

override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let controller = storyboard.instantiateViewController(withIdentifier: "DetailViewController") as! DetailViewController
    controller.selectedIndex = indexPath.row //pass selected cell index to next view.
    self.navigationController?.pushViewController(controller, animated: true)

}

Здесь вы можете передавать данные с помощью controller.selectedIndex = indexPath.row (Здесь я передаю выбранный индекс), поскольку selectedIndex является свойством DetailViewController, потому что я его объявилв DetailViewController.swift как

var selectedIndex = 0

И таким же образом вы можете передавать и другие данные, связанные с выбранным индексом.

Для получения дополнительной информации см. демонстрационный проект.

...