【问题标题】:Programming a UIButton is not working in Swift 4 Xcode 9 Beta 6, Cannot add target编程 UIButton 在 Swift 4 Xcode 9 Beta 6 中不起作用,无法添加目标
【发布时间】:2017-08-20 17:08:12
【问题描述】:

过去我以编程方式创建 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'

【问题讨论】:

  • 你的第一行代码永远不会在任何版本的 Swift 中编译。所以,你应该有问题,否则,你已经从你的没有问题的代码中改变了太多。无论如何,您需要显示该行的放置位置。显示整个方法,包括行。
  • 还有一个,你能告诉我你从哪里得到 Xcode 9 Beta 6 吗?我现在可以在Apple's download page 上找到的 Xcode 版本是 Xcode 9 beta 5 (Build 9M202q)。
  • 谢谢,你是对的。我已将代码编辑为在 Swift 2 时代可以使用的版本。你能明白我现在在说什么吗?
  • 我相信我能看到。但是您的问题只是 Swift 2.2 的一个问题和 Swift 4 的另一个问题的组合。
  • 为什么我还要用谷歌搜索这些东西。 WTF??

标签: uibutton selector swift4 xcode9-beta addtarget


【解决方案1】:

两点。

首先,从 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

【讨论】:

  • 你的意思是我们现在从 swift 4 中的 func 之前开始写 @objc ?
  • @ArgaPK,坦率地说我不明白你的意思,但是当通过 ObjC 选择器调用方法时,我们需要用 @objc 注释方法,除非有其他规则暗示 @objc。跨度>
【解决方案2】:
// Add Target   

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

    // Handle Action

        @objc func handleButton(_ sender: AnyObject) {


    }

【讨论】:

  • 虽然这个答案可能是正确且有用的,但最好在其中附上一些解释来解释它如何帮助解决问题。如果有更改(可能不相关)导致它停止工作并且用户需要了解它曾经是如何工作的,这在未来变得特别有用。
猜你喜欢
  • 1970-01-01
  • 2021-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-12
  • 1970-01-01
  • 2015-05-28
  • 1970-01-01
相关资源
最近更新 更多