在 Swift 4 Xcode 9 Beta 6 中无法对 UIButton 进行编程,无法添加目标

Programming a UIButton is not working in Swift 4 Xcode 9 Beta 6, Cannot add target

过去我以编程方式创建 UIButton 没有问题,但自从我使用 Xcode 9 和 Swift 4 以来,我找不到消除此错误的方法.

//Adding target to UIButton
func PositionStartButton(xOffset: Float){
    StartButton.frame = CGRect(x: Int(0 - 40 + xOffset), y: 0, width: 80, height: 80)
    StartButton.setImage(#imageLiteral(resourceName: "Logo_Final_WHITE_Face"), for: .normal)
    StartButton.addTarget(self, action: "pressButton:", for: .touchUpInside)
    ScrollView.addSubview(StartButton)

}

//The target function
func pressButton(_ sender: UIButton){
    print("\(sender)")
}

Error Message: 'NSInvalidArgumentException', reason: '-[Playing.MainMenuViewController pressButton:]: unrecognized selector sent to instance 0x10440a6b0'

两点。

首先,自从 Swift 2.2(与 Xcode 7.3 捆绑在一起,一年多前发布)以来,推荐的选择器符号是 #selector(...)。通过使用该表示法,您可能会获得比使用其他表示法更有用的诊断消息。

(您不应忽略使用推荐设置显示的任何警告。)

其次,在Swift 4中,您需要使用@objc显式注释通过选择器调用的方法。 (在非常有限的情况下,Swift 隐式应用该符号,但并不多。)

所以,您显示的代码应该是:

//Adding target to UIButton
func PositionStartButton(xOffset: Float){
    StartButton.frame = CGRect(x: Int(0 - 40 + xOffset), y: 0, width: 80, height: 80)
    StartButton.setImage(#imageLiteral(resourceName: "Logo_Final_WHITE_Face"), for: .normal)
    StartButton.addTarget(self, action: #selector(self.pressButton(_:)), for: .touchUpInside) //<- use `#selector(...)`
    ScrollView.addSubview(StartButton)

}

//The target function
@objc func pressButton(_ sender: UIButton){ //<- needs `@objc`
    print("\(sender)")
}

这并不重要,但您最好遵循 Swift 的简单编码规则——只有类型名称是大写的。

最好重命名您的 PositionStartButtonStartButtonScrollView,如果您认为您还有机会公开展示您的代码。

// Add Target   

 buttonName.addTarget(self, action: #selector(ViewController.handleButton(_:)), for: .touchUpInside)

    // Handle Action

        @objc func handleButton(_ sender: AnyObject) {


    }