我有一个带有多个集合视图的视图控制器。
每个集合视图都使用与 xib 相同的自定义单元格。 在这个 xib 中我有一个按钮。
collectionViews 的名称是
1) manPerfumeCV
2) womanPerfumeCV
3) kidsPerfumeCV
里面
cellForItemAt
我有cell.productCart.tag = indexPath.row
let cell:iPhoneCollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "iPhoneCell", for: indexPath) as! iPhoneCollectionViewCell
if collectionView == self.womanPerfumeCV {
let prods = womanPerfumeData[indexPath.row]
cell.configureCell(products: prods)
cell.productCart.tag = indexPath.row
} else if collectionView == self.manPerfumeCV {
let prods = manPerfumeData[indexPath.row]
cell.configureCell(products: prods)
cell.productCart.tag = indexPath.row
} else if collectionView == self.kidsPerfumeCV {
let prods = kidsPerfumeData[indexPath.row]
cell.configureCell(products: prods)
cell.productCart.tag = indexPath.row
}
在同一个视图控制器中,我对 xib 文件中的按钮执行了此操作
@IBAction func iPhoneAddToCart(_ sender: AnyObject) {
let butt = sender as! UIButton
let indexP = IndexPath(row: butt.tag, section: 0)
let cell = manPerfumeCV.cellForItem(at: indexP) as! iPhoneCollectionViewCell
print(manPerfumeData[indexP.row].price)
}
每个集合视图都有自己的 [Products] 数组。
1) manPerfumeData
2) womanPerfumeData
3) kidPerfumeData.
在我的代码中,如果我使用 manPerfumeData 点击第一个集合视图中的按钮,它会很好地打印价格。
尽管如果我按下第二个或第三个集合视图上的按钮,应用程序就会崩溃。
有什么方法可以知道他们从哪个集合视图按下按钮,以便我可以加载特定的 [Products] 数组?
谢谢!
您可以使用
tag
的 UIButton
属性。
让我们考虑一下你的代码
let cell:iPhoneCollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "iPhoneCell", for: indexPath) as! iPhoneCollectionViewCell
if collectionView == self.womanPerfumeCV {
//Your Code
cell.productCart.tag = indexPath.row + 1000
} else if collectionView == self.manPerfumeCV {
//Your Code
cell.productCart.tag = indexPath.row + 2000
} else if collectionView == self.kidsPerfumeCV {
//Your Code
cell.productCart.tag = indexPath.row + 3000
}
您注意到我更改了
tag
的 UIButton
属性。现在,当点击按钮时,检查 tag
的 UIButton
属性。像这样
if (sender.tag >= 1000 && sender.tag<2000)
{
//manPerfumeCV
}
else if (sender.tag >= 2000 && sender.tag<3000)
{
//womanPerfumeCV
}
else
{
//kidsPerfumeCV
}
要从数组中获取值,请从
tag
属性中减去起始值,您将获得值,如下所示
对于manPerfumeCV
indexValue = sender.tag - 1000
对于womanPerfumeCV
indexValue = sender.tag - 2000
对于儿童香水CV
indexValue = sender.tag - 3000
这个值可以直接用于从数组中获取数据。
为了实现它,您可以将 tag 属性添加到 viewDidLoad 中的 collectionViews
override func viewDidLoad() {
// your code
self.womanPerfumeCV.tag = 0;
self.manPerfumeCV.tag = 1;
self.kidsPerfumeCV = 2;
}
使用它您可以识别来源
//现在是时候监听buttonEvent了
我建议将事件监听器保留在同一个控制器中,或者仅使用索引和标签进行协议回调。
为了简单起见,让我们在同一个 viewController 文件中进行更改
if collectionView == self.womanPerfumeCV {
let prods = womanPerfumeData[indexPath.row]
cell.configureCell(products: prods)
cell.productCart.tag = indexPath.row
} else if collectionView == self.manPerfumeCV {
let prods = manPerfumeData[indexPath.row]
cell.configureCell(products: prods)
cell.productCart.tag = indexPath.row
} else if collectionView == self.kidsPerfumeCV {
let prods = kidsPerfumeData[indexPath.row]
cell.configureCell(products: prods)
cell.productCart.tag = indexPath.row
}
cell.yourButton.tag = (collectionView.tag * 1000 )+(indexPath.row);
cell.yourButton.addTarget(self, action: #selector(ButtonClicked(_:)), forControlEvents: .TouchUpInside)
现在将选择器添加到事件
func ButtonClicked(sender: UIButton) {
let index : Int = sender.tag % 1000;
switch sender.tag {
case let x where x < 1000:
loadDataFromFirstArrayWithIndex(index);break;
case let x where x <2000:
loadDataFromSecondArrayWithIndex(index);break;
default:
loadDataFromThirdArrayWithIndex(index);
}
}