har*_*ios 3 unrecognized-selector swift
我在这里编写简单的代码
self.navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Cancel, target: self, action: Selector("cancelClick"))
Run Code Online (Sandbox Code Playgroud)
实际功能
func cancelClick(isAlert:String = "yes"){
self.dismissViewControllerAnimated(true, completion: { () -> Void in
if isAlert == "yes" {
Functions.displayAlert("called")
}
})
}
Run Code Online (Sandbox Code Playgroud)
self.cancelClick() - 工作,但如果我没有通过参数 self.cancelClick(isAlert:"no") - 坠毁那么如果我必须在默认参数中传递参数,我的选择器应该是什么Selector("cancelClick"),Selector("cancelClick:")但都尝试过但没有运气。
问题是参数不是由你决定的。它始终是按钮(“发件人”),这是它唯一可以做到的。
换句话说,如果你想让这个函数有一个参数,那么无论如何你需要将你的选择器字符串设置为"cancelClick:"- 冒号意味着它需要一个参数。但该参数必须是按钮:
func cancelClick(bbi:UIBarButtonItem?) {
Run Code Online (Sandbox Code Playgroud)
但是,您会注意到我巧妙地将此 UIBarButtonItem 参数设置为 Optional。你认为我为什么这样做?因为现在你也可以直接调用并传nil:
self.cancelClick(nil)
Run Code Online (Sandbox Code Playgroud)
因此,cancelClick:现在有办法知道调用是来自点击按钮还是直接调用 - 如果bbi不是 nil,则按钮被点击;如果bbi 为nil,则直接从代码中调用我们。偷偷摸摸,嗯?
另一种偷偷摸摸的方法是将参数设为 AnyObject:
func cancelClick(sender:AnyObject) {
Run Code Online (Sandbox Code Playgroud)
这样做的好处在于您可以使用任何类型的类实例调用它。cancelClick可以检查sender. 如果它是一个 UIBarButtonItem( sender is UIBarButtonItem),那么我们通过点击按钮被调用。否则,如果在代码中调用,您可以传入字符串或此函数可能准备处理的任何其他内容。