我一直在使用sendAction
方法与nil
target
通信Cells(UITableViewCell/UICollectionViewCell)
到ViewControllers
的操作,而不是实现委托。
自Swift 2.2以来,选择器的语法已经更新,我收到了一些警告。新的#selector
语法始终指定selectorname
后跟classname
。如果我提到类名,那么将目标设置为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");
}
}
答案 0 :(得分:3)
您可以使用mysql -uroot -p
从Objective-C样式的字符串创建选择器。要避免出现“使用#selector”的警告,请使用参数存储选择器名称并将其传递给Selector()
,而不是直接传递字符串文字。
Selector()
答案 1 :(得分:2)
为什么使用sendAction
代替NSNotificationCenter
?
答案 2 :(得分:2)
您可以(也可能应该)通过#selector(CartVC.updateCartWithTotalAmountPayableWithDiscount)
。当你这样做时,你说你想要updateCart...
类定义的CartVC
函数的选择器 - 而不是某个其他类定义的updateCart...
函数。
这与将nil
作为目标传递的含义不同 - 您在#selector
表达式中命名的类澄清您想要发送的消息是什么在定义它的类上。目标是谁您将消息发送到。当您为目标选择nil时,您说消息应该转到可以处理它的第一个对象 - 可能是CartVC
的几个实例之一,或者是接受相同消息的另一个类的实例。
答案 3 :(得分:0)
为此,为时已晚,但是现在您应该定义一个对Objective-C运行时可见的协议并使用该协议。我猜UITableViewDelegate现在看起来更漂亮了,不是吗? :)