Unrecognized selector sent to instance in UIButton

Viewed 355

I have a collection view and image view inside it and I added a UIButton to delete the image after selection. When I click the button it crashes and gives me this error:

AdPostViewController deleteUser]: unrecognized selector sent to instance 0x7fb588d5b7f0

Why is this happening and how do I fix this? Here is my code:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ImageCell", for: indexPath) as! ImageCell
    
    let img = self.PhotoArray[indexPath.row]
    cell.image.image = img
    
    cell.deleteButton?.layer.setValue(indexPath.row, forKey: "index")
    cell.deleteButton?.addTarget(self, action: Selector(("deleteUser")), for: UIControl.Event.touchUpInside)
    
    return cell
}

func deleteUser(_ sender: UIButton) {
    let i: Int = (sender.layer.value(forKey: "index")) as! Int
    PhotoArray.remove(at: i)
    // PhotoArray.removeAtIndex(i)
    ImagesCollectionView.reloadData()
}
1 Answers

One problem is that you are forcing manual formation of the Objective-C selector, and you don't actually know how to form an Objective-C selector manually so you are getting it wrong. Don't do that! Let the compiler form the selector for you. That's its job. Replace

action: Selector(("deleteUser"))

with

action: #selector(deleteUser)

Also, you need to expose your deleteUser method to Objective-C explicitly:

@objc func deleteUser(_ sender: UIButton) {

Otherwise Objective-C still won't be able to introspect your class and find this method when the time comes to call it. Fortunately, when you switch to #selector syntax, the compiler will call out that issue for you!

Related