将多个插座连接到单个动作?

时间:2015-08-06 15:47:02

标签: xcode swift uibutton iboutlet custom-keyboard

我正在XCode Beta 7(Swift2)中创建键盘扩展。

我正在尝试将多个按钮连接到一个动作。

但是,当我将所有按钮插座连接到此动作时,会导致我的键盘崩溃,这让我觉得有些东西我不知道。

@IBOutlet weak var Label: UIButton!


@IBAction func ButtonTapped(sender: AnyObject) {

    Label.setTitle("Hello!", forState: .Normal)
    Label.hidden = false
    Label.backgroundColor = UIColor.whiteColor().colorWithAlphaComponent(0.5)

    NSTimer.scheduledTimerWithTimeInterval(2, target: self, selector: "hideLabel", userInfo: nil, repeats: false)
}

@objc func hideLabel() {
    Label.hidden = true
    Label.backgroundColor = UIColor.clearColor()

}

1 个答案:

答案 0 :(得分:1)

将相同的操作附加到多个按钮不是问题,并且是常用技术。

但是,你将Label设置为force-unwrapped,如果它是nil则会崩溃。

我的猜测是你的Label插座没有连接,所以Label在运行时是零。

将标签类型从UIButton!更改为UIButton?,然后将代码更改为使用"如果让"如果label为非零,则可选绑定仅使用Label执行代码。

顺便说一下,Swift有一个强大的命名惯例。变量名称应以小写字母开头,并使用" camel case"对于变量名的其余部分。只有类名和类型名称应以大写字母开头。所以"标签"应该是"标签"代替。养成遵循这种风格的习惯。它可以为您和其他人提供清晰的视觉提示,让您阅读代码,了解名称所指的内容类型。

最后,"标签"是一个可怕的按钮名称。它是一个按钮,而不是UILabel。称之为" myButton"或者其他东西。

修改

代码可能如下所示:

@IBOutlet weak var myButton: UIButton?


@IBAction func ButtonTapped(sender: AnyObject) 
{
  println("myButton = \(myButton)")  //See if myButton is nil
  if let myButton = myButton
  {
    myButton.setTitle("Hello!", forState: .Normal)
    myButton.hidden = false
    myButton.backgroundColor = UIColor.whiteColor().colorWithAlphaComponent(0.5)

    NSTimer.scheduledTimerWithTimeInterval(2, target: self, 
      selector: "hidemyButton", 
      userInfo: nil, repeats: false)
    }
}

@objc func hidemyButton() 
{
    myButton.hidden = true
    myButton.backgroundColor = UIColor.clearColor()

}