如何在 UICollectionview 中返回动态 numberOfItemsInSection
Posted
技术标签:
【中文标题】如何在 UICollectionview 中返回动态 numberOfItemsInSection【英文标题】:How to return dynamic numberOfItemsInSection in UICollectionview 【发布时间】:2018-12-31 05:56:08 【问题描述】:我在UITableView
中有viewForHeaderInSection
基于viewForHeaderInSection
数据每个UITableviewCell
在UICollectionViewCell
中有UICollectionView
我必须显示“产品”和“数量”的数据每个“产品”的数量每个viewForHeaderInSection
的“数量”都不同。我能够实现 tableview 标题和单元格数据,但我无法基于 json “order_id”、“order_unique_id”、“store_name”和“otp_store”中的 UITableViewHeader
数据获取 UICollectionViewCell
数据是 tableview 标题部分数据而“user_details”是tableviewcell
uicollectionviewcell
“产品”和“数量”的数据
"status": "1",
"error": false,
"data": [
"order_id": "11",
"order_unique_id": "ORDR-1001",
"store_name": "24X7",
"otp_store": "781103",
"product": [
"Product One",
"Product Two"
],
"qty": [
"1",
"3"
],
"user_details":
"name": "Pankaj Ravi",
"number": "0999889",
"landmark": "PBH",
"area": "Bow East",
"pincode": "E3 9EG",
"place": "Home"
,
"status": "2",
"date": "2018-12-13",
"time": "14:37:57"
,
"order_id": "1",
"order_unique_id": "ORDR-988",
"store_name": "24X7",
"otp_store": "957505",
"product": [
"Product Eight"
],
"qty": [
"1"
],
"user_details":
"name": “Jhon”,
"number": “999996",
"landmark": “Ithum",
"area": "Bow East",
"pincode": "E3 9EG",
"place": "Office"
,
"status": "0",
"date": "2018-11-24",
"time": "12:41:02"
]
UITableview 代码
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?
print(section)
let headerCell = Bundle.main.loadNibNamed("CustomHeaderCell", owner: self, options: nil)?.first as! CustomHeaderCell
if runnerArray.count > 0
headerCell.btnHeader.setTitle("\("x " + runnerArray[section].order_unique_id)", for: UIControl.State.normal)
var status = runnerArray[section].status
if status == "0"
status = "Pending"
else if status == "1"
status = "Dispatch"
else
status = "Complete"
let lblHeaderText = status + " " + runnerArray[section].time + " , " + runnerArray[section].date
headerCell.lblHeader.text = lblHeaderText
return headerCell
else
return UIView()
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
return 40
func numberOfSections(in tableView: UITableView) -> Int
return runnerArray.count
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return 1
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
return 400
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
if let cell = tableView.dequeueReusableCell(withIdentifier: "CustomTableViewCell", for: indexPath) as? CustomTableViewCell
cell.setDataForOTPStoreAndName(runner: runnerArray[indexPath.section])
cell.setDataForProduct(userDetails: userDetailsArray[indexPath.section])
cell.selectionStyle = .none
return cell
return UITableViewCell()
UICollectionView 单元的代码
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
//Note:- Here i am not able to find how to return array count based on UItableviewheadersection data
return productArray.count
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ProductsCollectionViewCell", for: indexPath) as? ProductsCollectionViewCell
cell.lblProductName.text = productArray[indexPath.row]
return cell
return UICollectionViewCell()
【问题讨论】:
请通过您的tableview
和 collectionview
委托和数据源方法的完整代码
@PratikPrajapati 添加了 UITableview 和 UICollectionview 的代码
在 tableView cellForRowAt
方法中,您必须传递您的集合数据,例如 cell.productArray = runnerArray[indexPath.section].product
和 cell.productArray = runnerArray[indexPath.section].qty
然后在 cell.collectionView.reloadData()
中重新加载您的集合视图
@PratikPrajapati 非常感谢它对我有用
【参考方案1】:
您添加此代码以显示标题的数量,每个标题添加一行,然后将一个部分对象传递给表格单元格使用下面的代码。
import UIKit
class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource
var dataArry : [DataObj]?
override func viewDidLoad()
super.viewDidLoad()
if let path = Bundle.main.path(forResource: "response", ofType: "json")
do
let data = try Data(contentsOf: URL(fileURLWithPath: path), options: .alwaysMapped)
let jsonObj = try JSONDecoder().decode(Modal.self, from: data)
self.dataArry = jsonObj.data
print("jsonData:\(jsonObj)")
catch let error
print("parse error: \(error.localizedDescription)")
else
print("Invalid filename/path.")
func numberOfSections(in tableView: UITableView) -> Int
if let count = self.dataArry?.count
return count
return 0
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return 1
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: "RowCell") as? RowCell
cell?.updateCell(dataObj: self.dataArry?[indexPath.section] ?? DataObj())
return cell!
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?
let cell = tableView.dequeueReusableCell(withIdentifier: "HeaderCell") as? HeaderCell
cell?.textLabel?.text = dataArry?[section].store_name
return cell
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
return 60
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
return 200
然后将此代码添加到您的 tableview 单元格类中
func updateCell(dataObj:DataObj)
self.dataObj = dataObj
collectionView.delegate = self
collectionView.dataSource = self
collectionView.reloadData()
func numberOfSections(in collectionView: UICollectionView) -> Int
return 2
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
if section == 0
if let count = self.dataObj?.product?.count
return count
else if section == 1
if let count = self.dataObj?.qty?.count
return count
return 0
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
if indexPath.section == 0
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionViewCell", for: indexPath) as? CollectionViewCell
cell?.titlelbl.text = self.dataObj?.product?[indexPath.row]
return cell!
else if indexPath.section == 1
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionViewCell", for: indexPath) as?
CollectionViewCell
//cell?.backgroundColor = UIColor.yellow
cell?.titlelbl.text = self.dataObj?.qty?[indexPath.row]
return cell!
return UICollectionViewCell()
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize
return CGSize(width: 100.0, height: 100.0)
【讨论】:
以上是关于如何在 UICollectionview 中返回动态 numberOfItemsInSection的主要内容,如果未能解决你的问题,请参考以下文章
如何在 UICollectionView 中向下移动某些单元格
如何在 UICollectionView 单元格中获取 UIImageView 的帧大小
在 UICollectionView 中点击单元格返回错误的索引