У меня есть UIButton внутри CollectionViewCell, который снова находится внутри TableViewCell. Как перейти к следующему контроллеру представления, нажав UIButton? - PullRequest
0 голосов
/ 21 января 2019

У меня есть UIButton внутри UICollectionViewCell, которая находится внутри UITableViewCell, мне нужно перейти на другую UIViewController, нажав эту кнопку UIButton. Но UINavigationController не работает внутри UICollectionViewCell. Кто-нибудь может помочь, пожалуйста?

Я не нахожу навигационный контроллер в своем коде.

import UIKit

class TrendingProductTVCell: UITableViewCell {

    @IBOutlet weak var trendingProductCV: UICollectionView!

    override func awakeFromNib() {
        super.awakeFromNib()
        trendingProductCV.delegate = self
        trendingProductCV.dataSource = self
    }
}


extension TrendingProductTVCell: UICollectionViewDataSource, UICollectionViewDelegate {

    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = trendingProductCV.dequeueReusableCell(withReuseIdentifier: "TrendingProductsCVCell", for: indexPath) as? TrendingProductsCVCell
        cell?.trendingAddToCartBtn.addTarget(self, action: #selector(addToCartBtnTapped), for: .touchUpInside)
        return cell!
    }

    @objc
    func addToCartBtnTapped(sender: UIButton){
       let productDetail = trendingProductsDataArray[sender.tag]
    }
}

Ответы [ 4 ]

0 голосов
/ 21 января 2019

Вы можете получить parentViewController для любого представления, используя это расширение:

extension UIView {
  var parentViewController: UIViewController? {
    var parentResponder: UIResponder? = self
    while parentResponder != nil {
        parentResponder = parentResponder!.nextResponder()
        if parentResponder is UIViewController {
            return parentResponder as! UIViewController!
        }
    }
    return nil
  }
}

Тогда вы сможете получить доступ к parentViewController внутри UITableViewCell ИЛИ UICollectionViewCell.Получите navController для этого parentViewController и нажмите на следующий изнутри UICollectionViewCell.

0 голосов
/ 21 января 2019

Вы можете сделать любую из двух вещей

1. Опубликовать уведомление с помощью NotificationCenter , отправить в productDetail в userInfo и прослушайте уведомление в ViewController , которое содержит ваш tableView
2. Или вы можете просто создать Protocol с помощью метода, который вы хотитезапускать при выборе продукта, добавить свойство делегат в TableViewCell , отправить ссылку на контроллер при создании ячейки (в cellForRowAt: ),и вызовите метод для этого делегата , когда продукт выбран.

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

0 голосов
/ 21 января 2019

Вы можете использовать протокол делегата.

protocol TrendingProductTVCellDelegate {
    func addToCart(product: Product)
}

class TrendingProductTVCell: UITableViewCell {
    var delegate: TrendingProductTVCellDelegate?
}

extension TrendingProductTVCell: UICollectionViewDataSource, UICollectionViewDelegate {
    @objc func addToCartBtnTapped(sender: UIButton){
       let productDetail = trendingProductsDataArray[sender.tag]
       delegate?.addToCart(product: productDetail)
    }
}

UINavigationController доступен только через ViewController.Поэтому ваш TrendingProductViewController должен прослушивать протокол, и теперь вы можете получить доступ к navigationController.

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = ... // your TrendingProductTVCell
    cell.delegate = self // <- important
    ...
}

extension TrendingProductViewController: TrendingProductTVCellDelegate {
    func addToCart(product: Product) {
        navigationController.push() // your rest code here....
    }
}
0 голосов
/ 21 января 2019

Использование делегата: с помощью делегата вы можете предоставить вызывающей стороне больше информации, и в этом случае она более гибкая.Лучшее решение использовать делегат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...