13

过去,我以编程方式创建 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)")
}

错误消息:'NSInvalidArgumentException',原因:'-[Playing.MainMenuViewController pressButton:]:无法识别的选择器发送到实例 0x10440a6b0'

4

2 回答 2

22

两点。

首先,自从 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 的简单编码规则——只有类型名称大写。

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

于 2017-08-21T11:11:33.923 回答
1
// Add Target   

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

    // Handle Action

        @objc func handleButton(_ sender: AnyObject) {


    }
于 2018-05-18T15:34:58.123 回答