仅在代码中添加按钮?

时间:2014-10-08 17:53:27

标签: ios iphone swift uibutton

我试图仅在代码中添加按钮。在Xcode Simulator中,它可以完美地工作,但不能在我的设备上运行:

fatal error: unexpectedly found nil while unwrapping an Optional value

我的代码:

@IBOutlet weak var playButton: UIButton!

override func viewDidLoad() {

    super.viewDidLoad()

    let image = UIImage(named: "playButton.png") as UIImage

    playButton   = UIButton.buttonWithType(UIButtonType.System) as UIButton
    playButton.frame = CGRectMake(10, 10, 100, 100) // crash is here
    playButton.center = CGPointMake(self.frame.width/2, self.frame.height/1.7)

    playButton.addTarget(self, action: "transition:", forControlEvents: UIControlEvents.TouchUpInside)
    playButton .setBackgroundImage(image, forState: UIControlState.Normal)

    self.view?.addSubview(playButton)

}
有人可以帮帮我吗?

3 个答案:

答案 0 :(得分:2)

  

在Xcode Simulator中它可以很好地工作但不在我的设备上

这通常意味着您的代码与文件的实际名称不匹配。 MacOS X文件系统通常区分大小写,而iOS文件系统 区分大小写。因此,如果您的图片文件的名称类似于PlayButton.pngplayButton.PNG,但您指定了playButton.png,那么它通常可以在模拟器上运行,但不能在设备上运行。

确保代码中的文件名与项目中的文件匹配。

答案 1 :(得分:1)

这没有任何意义 - 如果您使用的是@IBOutlet,这意味着您的按钮是在故事板中创建的,因此您无需初始化它:

let image = UIImage(named: "playButton.png") as UIImage

playButton   = UIButton.buttonWithType(UIButtonType.System) as UIButton
playButton.frame = CGRectMake(10, 10, 100, 100) // crash is here
playButton.center = CGPointMake(self.frame.width/2, self.frame.height/1.7)

playButton.addTarget(self, action: "transition:", forControlEvents: UIControlEvents.TouchUpInside)
playButton .setBackgroundImage(image, forState: UIControlState.Normal)

self.view?.addSubview(playButton)

删除所有上述代码,并在故事板中进行设置。 @IBAction应该是一个单独的方法,它连接到故事板中按钮的touchUpInside。

答案 2 :(得分:1)

"展开期权价值"似乎是指你的var声明旁边的 ...如果你使用怎么办?

来自Swift doc

Trying to use ! to access a non-existent optional value triggers a runtime error. 
Always make sure that an optional contains a non-nil value before using ! to force-unwrap its value.

试试这个:

weak var playButton : UIButton?

并添加?在访问它之后 - 就像你使用self.view?.addSubview一样,或者在你知道已经创建的方法中用强制解开它

(我不确定,还在学习语言......: - )