Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在没有发件人的情况下将目标添加到UIButton_Ios_Swift_Uibutton_Selector_Sender - Fatal编程技术网

Ios 如何在没有发件人的情况下将目标添加到UIButton

Ios 如何在没有发件人的情况下将目标添加到UIButton,ios,swift,uibutton,selector,sender,Ios,Swift,Uibutton,Selector,Sender,我有一个功能 func MyFunc (_ sender: AnyObject) { let n = sender.tag! //do stuff with 'n' } 我在创建新按钮时连接它 NewButton.addTarget(self, action: #selector(Main.MyFunc(_:)), for: .touchUpInside) 我想在没有发件人的情况下在代码的其他区域调用MyFunc。是否可以在不使用sender的情况下将.addTarget添加到按

我有一个功能

func MyFunc (_ sender: AnyObject) { 
    let n = sender.tag! //do stuff with 'n'
}
我在创建新按钮时连接它

NewButton.addTarget(self, action: #selector(Main.MyFunc(_:)), for: .touchUpInside)

我想在没有发件人的情况下在代码的其他区域调用
MyFunc
。是否可以在不使用sender的情况下将.addTarget添加到按钮

比如

NewButton.addTarget(self, action: #selector(Main.MyFunc(n: 5)), for: .touchUpInside)
而且

func MyFunc (n: Int) {
    //do stuff with 'n'
}

我知道一个解决方案是一个路由函数,比如

func router (_ sender: AnyObject) {
    MyFunc(n: sender.tag!)
}

但是我想知道是否有更优雅的方法。

因为函数接受类型为
AnyObject
的发送方,所以可以使用任何对象作为函数的参数。然后,您只需要有条件地将其强制转换为所需的类型

let button = UIButton()
button.addTarget(self, action: #selector(touched(_:)), for: .touchUpInside)

touched(1 as AnyObject) // Works

@objc func touched(_ sender: AnyObject) {
    if let casted = sender as? Int {
        // Do something with casted as an Int
    } else if let casted = sender as? UIButton {
        // do something with casted.tag
    }
}

什么?为什么不把按钮作为参数传递呢?是的,你可以创建一个没有发送者的目标。只是不要把争论放在一边。如果说连接,你是指通过故事板,那么我认为它一定有一个发送者。。