Ios swift按功能替换选择器

Suj*_*U N 4 action selector uibutton ios swift2

我只想在按钮点击上写一两行代码

print("Button Clicked")
Run Code Online (Sandbox Code Playgroud)

为此我不想创建一个单独的功能,并通过选择器调用

action: #selector(BtnKlkFnc(_:))
Run Code Online (Sandbox Code Playgroud)

我想简化一下

action: { action in print("Button Clicked")}
Run Code Online (Sandbox Code Playgroud)

我也试过了

#selector({print("Button Clicked")})
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮我简化这一点

我是stackoverflow的新手,还没有足够的声誉,所以请投票支持我的问题,所以我可以投票给你的ans

Dun*_*n C 6

简短回答:你做不到.Button动作是Cocoa/Cocoa touch内置的目标/动作机制的一部分.它基于选择器,您必须创建一个命名方法并使用它的选择器.您不能使用Swift闭包作为按钮操作.

编辑:

请注意,可以创建具有闭包属性的UIButton的自定义子类,并在点击按钮时调用该闭包.你要做的是让按钮的init方法自己设置为touchUpInside事件的目标,并调用按钮的方法,然后调用你的闭包(在确保closure属性不是nil之后).

编辑#2:

请注意,创建自定义子类非常简单,该子类UIButton将自身设置为按下按钮的目标并保持闭包.

这是一个示例实现:

class ClosureButton: UIButton {

    var buttonClosure: ((UIButton) -> Void)?

     required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.addTarget(self, action: #selector(handleTap(_:)), for: .touchUpInside)
        }

    @objc func handleTap(_ sender: UIButton) {
        if let buttonClosure = buttonClosure {
            buttonClosure(sender)
        } else {
            print("No button closure defined")
            return
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并在您的视图控制器中:

override func viewDidLoad() {
    super.viewDidLoad()
    button.buttonClosure = { _ in
        print("You tapped the button")
    }
}
Run Code Online (Sandbox Code Playgroud)