在 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 现在看起来更漂亮了,不是吗? :)
我一直在使用 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 现在看起来更漂亮了,不是吗? :)