在 Swift 3 中使用 UIApplication.sharedApplication().sendAction 发送匿名操作

Sending anonymous actions using UIApplication.sharedApplication().sendAction in Swift 3

我一直在使用 sendAction 方法和 nil target 来传达从 Cells(UITableViewCell/UICollectionViewCell)ViewControllers 的操作,而不是实现委托。

自 Swift 2.2 以来,选择器的语法已更新,我收到了一些警告。新的 #selector 语法坚持指定 selectorname 后跟 classname。如果我提到 class 名称,那么将目标设置为 nil 就没有任何意义。

有什么解决方法吗?

    class RedeemCell: UICollectionViewCell { 
    @IBAction func redeemAction(sender: AnyObject) {                 
      UIApplication.sharedApplication().sendAction("updateCartWithTotalAmountPayableWithDiscount:", to: nil, from: self, forEvent: nil)
        } 
    }

class CartVC: UIViewController {

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

        let cell: UICollectionViewCell?

            cell = collectionView.dequeueReusableCellWithReuseIdentifier("redeempoints", forIndexPath: indexPath)


        return cell!;
    }

func updateCartWithTotalAmountPayableWithDiscount(sender: AnyObject) {
        print("this will be called as the action movies through responderchain and encounters this method");
    }
}

你为什么要使用 sendAction 而不是使用 NSNotificationCenter 之类的东西?

您可以使用 Selector() 从 Objective-C 样式的字符串创建选择器。为避免出现 "Use #selector" 警告,请使用参数存储选择器名称并将其传递给 Selector() 而不是直接传递字符串文字。

let selectorName = "updateCartWithTotalAmountPayableWithDiscount:"
UIApplication.sharedApplication().sendAction(Selector(selectorName), to: nil, from: self, forEvent: nil)

您可以(并且可能应该)通过 #selector(CartVC.updateCartWithTotalAmountPayableWithDiscount)。当你这样做时,你是在说你想要一个 updateCart... 函数的选择器,它由 CartVC class 定义——与其他人定义的 updateCart... 函数相反class。

这与将 nil 作为目标传递的含义不同 — 您在 #selector 表达式中命名的 class 阐明了 什么您要发送的消息基于定义它的 class。目标是关于你发送消息。当您为目标选择 nil 时,您是说消息应该发送到可以处理它的第一个对象——它可以是 CartVC 的几个实例之一,或者另一个 class 的实例接受相同的消息。

有点太晚了,但现在您应该定义一个对 objective-c 运行时可见的协议并使用该协议。我想 UITableViewDelegate 现在看起来更漂亮了,不是吗? :)