在 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 的简单编码规则——只有类型名称是大写的。
最好重命名您的 PositionStartButton
、StartButton
和 ScrollView
,如果您认为您还有机会公开展示您的代码。
// Add Target
buttonName.addTarget(self, action: #selector(ViewController.handleButton(_:)), for: .touchUpInside)
// Handle Action
@objc func handleButton(_ sender: AnyObject) {
}
过去我以编程方式创建 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 的简单编码规则——只有类型名称是大写的。
最好重命名您的 PositionStartButton
、StartButton
和 ScrollView
,如果您认为您还有机会公开展示您的代码。
// Add Target
buttonName.addTarget(self, action: #selector(ViewController.handleButton(_:)), for: .touchUpInside)
// Handle Action
@objc func handleButton(_ sender: AnyObject) {
}