查找容器单元的索引
Find index of container cell
我正在尝试创建一个在线购物应用程序。目前,我正在处理一个在表格视图中显示类别的页面。在该 tableview 内部有一个 collectionview,其中包含与该类别相关的项目。例如:第一个单元格会说 'Electronics' 然后在它下面的一个 collectionview 单元格中放置一个相机,另一个单元格中放置一个 DVD 播放器。我已经到了可以创建单元格并填充正确数据的地步,但我不知道如何单击它们。
我正在使用这样的东西:
var categoryCollectionview:UICollectionView!
let categories = [Electronics, Shirts, Shoes]
//tableView
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "categoryContainer", for: indexPath) as! CategoryContainer
cell.title.text = "Top Sellers in \(categories[indexPath.row].name)"
categoryCollectionview = cell.categoryCollectionview
categoryCollectionview.dataSource = self
categoryCollectionview.delegate = self
}
//collectionView
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
//How can I know what category it's in?
let category = categories[0]
let item = category.items[indexPath.row].name
print("you clicked on \(item)")
}
这里的问题是应用程序无法找到它所在的类别。我需要将那个 0 变成它所在的任何 tableView 单元格的 indexPath.row。有谁知道该怎么做或知道有更好的方法吗?
使用 tag
categoryCollectionview.dataSource = self
categoryCollectionview.tag = indexPath.row
然后
let category = categories[collectionView.tag]
您使用的集合视图每次都是集合视图class的同一个实例,导致数据重叠。相反,您应该每次都创建一个新实例,以保持数据分离。我还建议在 willDisplay 函数中执行数据源和委托。
//var categoryCollectionview:UICollectionView!
//This was your problem ^
let categories = [Electronics, Shirts, Shoes]
//tableView
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "categoryContainer", for: indexPath) as! CategoryContainer
cell.title.text = "Top Sellers in \(categories[indexPath.row].name)"
}
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
if let cell = cell as? CollectionViewCell { //Your custom cell
let subcategoryView = cell.subcateogyrCollectionView
subcategoryView?.dataSource = self
subcategoryView?.delegate = self
subcateogryView?.tag = indexPath.row
subcategoryView?.reloadData()
}
}
//collectionView
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let category = categories[collectionView.tag]
let item = category.items[indexPath.row].name
print("you clicked on \(item)")
}
我正在尝试创建一个在线购物应用程序。目前,我正在处理一个在表格视图中显示类别的页面。在该 tableview 内部有一个 collectionview,其中包含与该类别相关的项目。例如:第一个单元格会说 'Electronics' 然后在它下面的一个 collectionview 单元格中放置一个相机,另一个单元格中放置一个 DVD 播放器。我已经到了可以创建单元格并填充正确数据的地步,但我不知道如何单击它们。
我正在使用这样的东西:
var categoryCollectionview:UICollectionView!
let categories = [Electronics, Shirts, Shoes]
//tableView
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "categoryContainer", for: indexPath) as! CategoryContainer
cell.title.text = "Top Sellers in \(categories[indexPath.row].name)"
categoryCollectionview = cell.categoryCollectionview
categoryCollectionview.dataSource = self
categoryCollectionview.delegate = self
}
//collectionView
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
//How can I know what category it's in?
let category = categories[0]
let item = category.items[indexPath.row].name
print("you clicked on \(item)")
}
这里的问题是应用程序无法找到它所在的类别。我需要将那个 0 变成它所在的任何 tableView 单元格的 indexPath.row。有谁知道该怎么做或知道有更好的方法吗?
使用 tag
categoryCollectionview.dataSource = self
categoryCollectionview.tag = indexPath.row
然后
let category = categories[collectionView.tag]
您使用的集合视图每次都是集合视图class的同一个实例,导致数据重叠。相反,您应该每次都创建一个新实例,以保持数据分离。我还建议在 willDisplay 函数中执行数据源和委托。
//var categoryCollectionview:UICollectionView!
//This was your problem ^
let categories = [Electronics, Shirts, Shoes]
//tableView
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "categoryContainer", for: indexPath) as! CategoryContainer
cell.title.text = "Top Sellers in \(categories[indexPath.row].name)"
}
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
if let cell = cell as? CollectionViewCell { //Your custom cell
let subcategoryView = cell.subcateogyrCollectionView
subcategoryView?.dataSource = self
subcategoryView?.delegate = self
subcateogryView?.tag = indexPath.row
subcategoryView?.reloadData()
}
}
//collectionView
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let category = categories[collectionView.tag]
let item = category.items[indexPath.row].name
print("you clicked on \(item)")
}