2014-10-08 85 views
0

我想只在代码中添加一个按钮。在Xcode模拟器它完美,但不是我的设备上:仅在代码中添加按钮?

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) 

} 

有人能帮助我吗?

+0

这是什么意思,它不适用于您的设备?说它不起作用是无用的。 – Fogmeister 2014-10-08 17:55:46

+0

我无法启动它,我有一个致命错误:“致命错误:在解包可选值时意外发现零” – Haox 2014-10-08 17:57:11

+0

您提供的代码在哪里?这是viewController的'viewDidLoad'方法中的代码吗? – Vinzzz 2014-10-08 18:09:11

回答

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。

+0

谢谢!我删除了@IBOutlet,因为我只想在代码中使用我的按钮,而且它的工作原理与此类似。 – Haox 2014-10-08 19:11:35

+0

你知道我该如何在场景上添加按钮?当我在我的GameScene中添加我的代码(不带@IBOutlet)时,该按钮不会出现。你知道为什么吗 ? – Haox 2014-10-08 19:25:26

+0

Haox,如果你指的是SpriteKit场景,我会检查http:// stackoverflow。com/questions/19082202/setting-up-buttons-in-skscene回答 – Valentin 2014-10-09 11:11:51

1

“解开一个选项的值”似乎是指在您的var声明旁边......如果您使用,该怎么办?取而代之?

从斯威夫特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或本地强制解包与在你知道它已经创建

(我不知道,虽然,仍然在学习语言的方法... :-)

+0

感谢您的帮助,但它不起作用。 – Haox 2014-10-08 19:17:40

2

In the Xcode Simulator it works perfectly but not on my device

这通常意味着你有之间的不匹配您的代码和文件的实际名称。 MacOS X文件系统通常是而不是区分大小写,而iOS文件系统区分大小写。所以,如果你的图像文件被命名为PlayButton.pngplayButton.PNG,但你指定playButton.png,它通常会在模拟器上工作,但不在设备上。

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

+0

谢谢!我知道区分大小写,但这不是问题。我查过了,没关系 – Haox 2014-10-08 19:08:37