Search code examples
swiftuicollectionviewcelladdtarget

Cannot add target with parameters in CollectionViewCell's button (Swift 4)


There is a button in my CollectionViewCell, I would like to trigger the UIActivityViewController (with an URL passing) when the button tapped.

I'm trying to add a target (with parameter) to the button which is in CollectionViewCell, but it seems it doesn't work, here are my codes:

  override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: verticalCellId, for: indexPath) as! VerticalCellId

    if let articleURL = self.card?[indexPath.item]._uRLAddress {

    cell.shareButton.addTarget(self, action: #selector(shareButtonPressed(sharedURL: articleURL)), for: .touchUpInside)

   }

}


  @objc func shareButtonPressed(sharedURL: String) {

    let shareText = sharedURL
    let activityViewController : UIActivityViewController = UIActivityViewController(activityItems: [shareText], applicationActivities: nil)
    activityViewController.popoverPresentationController?.sourceView = self.view
    self.present(activityViewController, animated: true, completion: nil)
}

The error is: Argument of '#selector' does not refer to an '@objc' method, property, or initializer

It just works well when no parameters passing, like this:

 override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: verticalCellId, for: indexPath) as! VerticalCellId

    if let articleURL = self.card?[indexPath.item]._uRLAddress {

    cell.shareButton.addTarget(self, action: #selector(shareButtonPressed), for: .touchUpInside)

   }

}

@objc func shareButtonPressed() {

    let shareText = NSLocalizedString("Share our app with friends.", comment: "share")
    let activityViewController : UIActivityViewController = UIActivityViewController(activityItems: [shareText], applicationActivities: nil)
    activityViewController.popoverPresentationController?.sourceView = self.view
    self.present(activityViewController, animated: true, completion: nil)
}

Any suggestion would be appreciated.


Solution

  • You cannot pass an arbitrary parameter in a target/action selector.

    The supported forms are

    • No parameter
    • One parameter which must be the sender of the action (shareButtonPressed(_ sender: UIButton))
    • Some UIControl items allow also an additional UIControlEvents parameter.