具有相同XIB单元格和按钮的多个集合视图

时间:2017-01-30 12:19:03

标签: ios swift swift3 uicollectionview

我有一个具有多个集合视图的视图控制器。

每个集合视图都使用与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]数组了吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

您可以使用tag的{​​{1}}属性。 让我们考虑你的代码

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 } 的{​​{1}}属性。现在点按按钮,检查tag的{​​{1}}属性。喜欢这个

UIButton

要从数组中获取值,从tag属性中减去起始值,您将获得值,如下所示

manPerfumeCV

UIButton

womanPerfumeCV

if (sender.tag >= 1000 && sender.tag<2000)
{
  //manPerfumeCV
}
else if (sender.tag >= 2000 && sender.tag<3000)
{
  //womanPerfumeCV
}
else
{
  //kidsPerfumeCV
}

kidsPerfumeCV

tag

此值可直接用于从数组中获取数据。

答案 1 :(得分:2)

为了实现它,您可以将标签属性添加到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);

    } 
}