单击UICollectionViewCell打开另一个屏幕

时间:2018-05-24 13:17:28

标签: swift uitableview uicollectionview

我的屏幕包含UITableView且在UICollectionViews内。 enter image description here

我需要点击UICollectionViewCell并打开下一个屏幕,然后将一些信息发送到这个新屏幕。但我不能。

根据我的结构“跟随”不起作用。我需要一些帮助才能找到另一种方法。

代码: - TableViewCell

class CategoriasTableViewCell: UITableViewCell {

    var db: Firestore!

    var categoriasArray = [Categorias]()

    @IBOutlet weak var collectionView: UICollectionView!
    @IBOutlet weak var labelTitleCategorias: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()

        collectionView.dataSource = self
        collectionView.delegate = self

        /*Firebase*/
        let autenticacao = Auth.auth()

        autenticacao.addStateDidChangeListener { (autenticacao, usuario) in

            if let usuarioLogado = usuario {

            } else {

                //self.performSegue(withIdentifier: "checkEntrarSegue", sender: nil)

            }


        }

        db = Firestore.firestore()
        loadData()

    }

    func loadData() {
        db.collection("Categories")
            .addSnapshotListener { querySnapshot, error in
                guard let documents = querySnapshot?.documents else {
                    print("Error fetching documents: \(error!)")
                    return
                }

                self.categoriasArray = querySnapshot!.documents.flatMap({Categorias(dictionary: $0.data())})
                DispatchQueue.main.async {
                    self.collectionView.reloadData()
                }
        }


    }

}

代码 - TableView

class TabHomeViewController: UIViewController {

    @IBOutlet weak var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.delegate = self
        tableView.dataSource = self


        let autenticacao = Auth.auth()
        autenticacao.addStateDidChangeListener { (autenticacao, usuario) in

            if usuario == nil {

                self.performSegue(withIdentifier: "logoutAutomatico", sender: nil)

                //....


            }

        }


    }


}


extension TabHomeViewController: UITableViewDataSource {

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 5
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        if indexPath.row == 0 {
            let cell = tableView.dequeueReusableCell(withIdentifier: "CellSlide", for: indexPath) as! SlideTableViewCell
            return cell

        } else if indexPath.row == 1 {
            let cell = tableView.dequeueReusableCell(withIdentifier: "CellCategorias", for: indexPath) as! CategoriasTableViewCell
            //cell.collectionView.reloadData()
            return cell

        } else if indexPath.row == 2{
            let cell = tableView.dequeueReusableCell(withIdentifier: "cellRecomendacoes", for: indexPath) as! RecomendacoesTableViewCell
            return cell

        } else if indexPath.row == 3 {
            let cell = tableView.dequeueReusableCell(withIdentifier: "cellPromocoes", for: indexPath) as! PromocoesTableViewCell
            return cell

        } else {
            let cell = tableView.dequeueReusableCell(withIdentifier: "cellFamosos", for: indexPath) as! FamososTableViewCell
            return cell
        }

    }

    /*func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {

        if indexPath.row == 1 {
            if let cell = cell as? CategoriasTableViewCell {

                cell.collectionView.reloadData()
                print("Atualizando Collection1")

            }
        }

    }*/


}

extension TabHomeViewController: UITableViewDelegate {

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        switch indexPath.row {
        case 0:
            return 215

        case 1:


            return 200

        case 2:


            return 300

        case 3:
            return 400

        case 4:
            return 500

        default:
            return UITableViewAutomaticDimension
        }
    }

}



//COLLECTION CATEGORIAS
extension CategoriasTableViewCell: UICollectionViewDataSource {

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

        return categoriasArray.count  //Int(Constant.totalItem)
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

        //set the image URL
        let urlBase = categoriasArray[indexPath.row].foto_horizontal
        let imageUrl = URL(string: urlBase)!

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "BoxCollectionCategorias", for: indexPath) as! CellCategoriasCollectionViewCell
        cell.labelNameCategoria.text = categoriasArray[indexPath.row].nome
        cell.imageView.sd_setImage(with: imageUrl) { (image, erro, cache, url) in
            // Here my code ...
        }
        return (cell)
    }

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

        print("Click... \(categoriasArray[indexPath.row].uid)")
        // Here I detect the click on the UICollectionViewCell
    }

}

extension CategoriasTableViewCell: UICollectionViewDelegateFlowLayout {

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return CGSize(width: 100, height: 130)
    }   
}

我正在使用扩展名CategoriasTableViewCell:UICollectionViewDataSource {} 来编辑UICollectionView数据

2 个答案:

答案 0 :(得分:0)

您只需为TableViewCell

创建委托即可
protocol CategoriasTableViewCellDelegate : class {
    func categoryTapped(_ cell: CategoriasTableViewCell, categoriasID:Int)
}

class CategoriasTableViewCell: UITableViewCell {
    weak var delegate : CategoriasTableViewCellDelegate?
}

并在CategoriasTableViewCell Extention

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

       if delegate != nil {
            delegate?.categoryTapped(self, categoriasID: categoriasArray[indexPath.row].uid)
        }
        print("Click... \(categoriasArray[indexPath.row].uid)")
        // Here I detect the click on the UICollectionViewCell
    }

TabHomeViewController设置cell.delegate = self

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        if indexPath.row == 0 {
            let cell = tableView.dequeueReusableCell(withIdentifier: "CellSlide", for: indexPath) as! SlideTableViewCell
            return cell

        } else if indexPath.row == 1 {
            let cell = tableView.dequeueReusableCell(withIdentifier: "CellCategorias", for: indexPath) as! CategoriasTableViewCell
            //cell.collectionView.reloadData()
           cell.delegate = self
            return cell

        } else if indexPath.row == 2{
            let cell = tableView.dequeueReusableCell(withIdentifier: "cellRecomendacoes", for: indexPath) as! RecomendacoesTableViewCell
            return cell

        } else if indexPath.row == 3 {
            let cell = tableView.dequeueReusableCell(withIdentifier: "cellPromocoes", for: indexPath) as! PromocoesTableViewCell
            return cell

        } else {
            let cell = tableView.dequeueReusableCell(withIdentifier: "cellFamosos", for: indexPath) as! FamososTableViewCell
            return cell
        }

    }

//现在你可以在TabHomeViewController中获取数据

extension TabHomeViewController:CategoriasTableViewCellDelegate {

        func categoryTapped(_ cell: CategoriasTableViewCell, categoriasID:Int){

    }

}

答案 1 :(得分:0)

您需要触发一个segue到达另一个视图,或者在当前视图之上显示您的新视图(除非您知道自己在做什么,否则我不建议这样做)。

要将您的信息从一个视图传递到另一个视图,您有以下几种选择:

  • 将其传递给segue(一对一)
  • 使用协议&代表(一对一)
  • 使用活动&观察员(一对多)
  • 使用负责保存当前数据的第三类(一对多)