【问题标题】:Unrecognized selector sent to instance in UIButton无法识别的选择器发送到 UIButton 中的实例
【发布时间】:2021-04-27 07:33:58
【问题描述】:

我在其中有一个集合视图和图像视图,我添加了一个UIButton 以在选择后删除图像。当我单击按钮时它崩溃并给我这个错误:

AdPostViewController deleteUser]:无法识别的选择器发送到实例 0x7fb588d5b7f0

为什么会发生这种情况,我该如何解决?这是我的代码:

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()
}

【问题讨论】:

    标签: ios swift uicollectionview uiimageview selector


    【解决方案1】:

    一个问题是您正在强制手动形成 Objective-C 选择器,而您实际上并不知道如何手动形成 Objective-C 选择器,所以您弄错了。不要那样做!让编译器为您形成选择器。这就是它的工作。替换

    action: Selector(("deleteUser"))
    

    action: #selector(deleteUser)
    

    此外,您需要将 deleteUser 方法显式公开给 Objective-C:

    @objc func deleteUser(_ sender: UIButton) {
    

    否则,Objective-C 仍然无法自省您的类并在调用该方法时找到该方法。幸运的是,当您切换到 #selector 语法时,编译器会为您指出该问题!

    【讨论】:

    • 不应该是#selector(deleteUser(_:)),因为他的选择器有匿名参数吗?
    • @DuncanC 不,没有歧义,因此基本名称可以作为对该函数的引用正常工作。这就是#selector 的喜悦。它认为你不必这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    相关资源
    最近更新 更多