带有默认参数的Swift Selector

时间:2015-06-07 18:27:53

标签: swift unrecognized-selector

我在这里写了简单的代码

self.navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Cancel, target: self, action: Selector("cancelClick"))

实际功能

func cancelClick(isAlert:String = "yes"){
    self.dismissViewControllerAnimated(true, completion: { () -> Void in

        if isAlert == "yes" {
            Functions.displayAlert("called")
        }
    })
 }
  1. self.cancelClick() - 工作但如果我没有通过论证
  2. self.cancelClick(isAlert:"no") - Crashed
  3. 那么如果我必须在默认的参数中传递参数,我的选择器应该是什么 尝试使用Selector("cancelClick")Selector("cancelClick:"),但没有运气。

2 个答案:

答案 0 :(得分:4)

问题是参数不适合你。它始终是按钮("发件人"),这是唯一的它可以是。

换句话说,如果你想让这个函数有一个参数,那么无论如何你需要将你的选择器字符串设置为"cancelClick:" - 冒号意味着它需要一个参数。但该参数必须是按钮:

func cancelClick(bbi:UIBarButtonItem?) {

但是,您会注意到我巧妙地将此UIBarButtonItem参数设置为Optional。为什么你认为我这样做了?因为现在你可以直接调用它并传递nil:

self.cancelClick(nil)

因此,cancelClick:现在可以通过点击按钮或直接通话来了解通话 - 如果bbi不是零,则点按按钮;如果bbi 为零,我们会直接从代码中调用。偷偷摸摸,嗯?

另一个偷偷摸摸的方法是将参数设为AnyObject:

func cancelClick(sender:AnyObject) {

这样做的好处是你可以用任何类的类实例来调用它。 cancelClick可以检查sender的类型。如果它是UIBarButtonItem(sender is UIBarButtonItem),那么我们通过点击按钮来调用。否则,如果在代码中调用,则可以传入一个字符串或该函数可能准备处理的任何其他内容。

答案 1 :(得分:0)

请勿使用slf4j-api-1.7.12.jar,而只需使用冒号Selector("cancelClick:"),以便传递参数。

正如马特所说,你必须传递的论点是"cancelClick:"(按钮)本身。