#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:
- Объявите обратный вызов в подклассе tableViewCell.
class CategoryNewTableCell: UITableViewCell {
var onSelectSubcategory: ((_ subcategoryID: String) -> Void)?
}
- Назначьте этот обратный вызов в вашем
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)
}
- Вызовите этот обратный вызов из 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?