Как передать значение индекса ячеек collectionview в nextviewcontroller(с помощью push-навигации) в swift

#ios #swift #uicollectionview #pushviewcontroller

Вопрос:

Я использую collectionview в ячейке tableview,

мне нужно передать значение выбранных ячеек collectionview следующему контроллеру просмотра, как?

код: вот код для ячеек tableview и collectionview

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

let cell = tableView.dequeueReusableCell(withIdentifier: "CategoryNewTableCell", for: indexPath) as! CategoryNewTableCell

        let indexData = self.activeCategories?[indexPath.row]
        cell.selectionStyle = .none
        cell.catNameLbl.text = indexData?.details?.first?.title

        cell.subCategories = indexData?.sub_categories
        cell.clcSeller.reloadData()
 }



class CategoryNewTableCell: UITableViewCell,UICollectionViewDelegate,UICollectionViewDataSource{

@IBOutlet weak var clcSeller: UICollectionView!

public var subCategories : Array<Sub_categories>?

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return subCategories?.count ?? 0
 }

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

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "SubCatCollectionCell", for: indexPath) as! SubCatCollectionCell

    let subCategory = self.subCategories?[indexPath.item]
    cell.lblTitle.text = langType == .en ? subCategory?.details?.first?.title : subCategory?.details?[1].title

    return cell
 }

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

    let vc = StoryBoard.main.instantiateViewController(withIdentifier: "SearchResultVC") as! SearchResultVC
    vc.subCatId = sub_categories?[indexPath.row].slug ?? ""
    self.navigationController?.pushViewController(vc, animated: true)
}

}
 

здесь, если я использую didSelectItemAt для collectionview, чтобы отправить выбранное значение ячейки на следующий контроллер представления

ошибка:

Значение типа ‘CategoryNewTableCell’ не имеет элемента ‘NavigationController’

если я дам действие кнопки в основном классе, то смогу нажать, но значение не будет

 class CategoryNewVC: UIViewController {

@IBAction func didselectcollectionviewBTn(_ sender: UIButton) {

    let vc = StoryBoard.main.instantiateViewController(withIdentifier: "SearchResultVC") as! SearchResultVC

    vc.subCatId = //here how to pass value

    self.navigationController?.pushViewController(vc, animated: true)
 }
}
 

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

Редактировать

в соответствии с приведенным ниже ответом я добавил: до сих didSelectItemAt пор не позвонил, почему, пожалуйста, помогите

   class CategoryNewTableCell: UITableViewCell,UICollectionViewDelegate,UICollectionViewDataSource{

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

//

Комментарии:

1. Создайте целочисленную переменную на стороне получателя. И передайте ему номер, прежде чем нажимать на контроллер просмотра приемника.

2. @ElTomato да, он есть в reciverVc, subCatId но как отправить subCategory?.details?.first?.title ему значение

Ответ №1:

Вы можете использовать протокол для отправки данных на свой nextviewcontroller.

 protocol CategorySelectionDelegate {
    func get(category: Sub_categories)
}
 

Объявите делегат в вашей ячейке CategoryNewTableCell и используйте его в методе didSelectItemAt вашей ячейки collectionviewcell, как показано ниже:

 class CategoryNewTableCell:
    UITableViewCell,UICollectionViewDelegate,UICollectionViewDataSource{
    
    @IBOutlet weak var clcSeller: UICollectionView!
    
    public var subCategories : Array<Sub_categories>?
    
    var delegate: CategorySelectionDelegate?
    
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return subCategories?.count ?? 0
    }
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "SubCatCollectionCell", for: indexPath) as! SubCatCollectionCell
        
        let subCategory = self.subCategories?[indexPath.item]
        cell.lblTitle.text = langType == .en ? subCategory?.details?.first?.title : subCategory?.details?[1].title
        
        return cell
    }
    
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        delegate?.get(category: sub_categories?[indexPath.row])
    }
}
 

Примите протокол в принимающем классе

 class CategoryNewVC: UIViewController, CategorySelectionDelegate {
    func get(category: Sub_categories) {
        let vc = StoryBoard.main.instantiateViewController(withIdentifier: "SearchResultVC") as! SearchResultVC
        vc.subCatId = category.slug ?? ""
        self.navigationController?.pushViewController(vc, animated: true)
    }
}
 

Ответ №2:

  1. Объявите обратный вызов в подклассе tableViewCell.
 class CategoryNewTableCell: UITableViewCell {
    var onSelectSubcategory: ((_ subcategoryID: String) -> Void)?
}
 
  1. Назначьте этот обратный вызов в вашем cellForRow вот так.
 cell.subCategories = indexData?.sub_categories
cell.onSelectSubcategory = { [weak self] (subcategoryID) in
    let vc = StoryBoard.main.instantiateViewController(withIdentifier: "SearchResultVC") as! SearchResultVC
    vc.subCatId = subcategoryID
    self?.navigationController?.pushViewController(vc, animated: true)
}
 
  1. Вызовите этот обратный вызов из CollectionView didSelectItem следующим образом.
 func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    let subcategoryID = sub_categories?[indexPath.item].slug ?? ""
    self.onSelectSubcategory?(subcategoryID)
}
 

Комментарии:

1. в этой строке let subcategoryID = sub_categories?[indexPath.item].slug ?? "" вместо sub_categories я добавил subCategories , но ничего не работает.. нет ошибки.. и не собираюсь в следующий ВК, а также

2. didSelectItemAt не звонит… почему?

3. Вы должны добавить clcSeller.delegate = self в свой подкласс tableViewCell. В противном случае метод делегата не будет вызван.

4. я добавил вот так за delegate то, что до сих didSelectItemAt пор не позвонил, пожалуйста, помогите

5. Можете ли вы поделиться дополнительным кодом, в котором вы назначаете делегата clcSeller.delegate = self внутри подкласса tableViewCell?