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

时间:2016-05-04 07:37:13

标签: ios objective-c swift swift2.2

我一直在使用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");
    }
}

4 个答案:

答案 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现在看起来更漂亮了,不是吗? :)