我试图仅在代码中添加按钮。在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)
}
有人可以帮帮我吗?
答案 0 :(得分:2)
在Xcode Simulator中它可以很好地工作但不在我的设备上
这通常意味着您的代码与文件的实际名称不匹配。 MacOS X文件系统通常不区分大小写,而iOS文件系统 区分大小写。因此,如果您的图片文件的名称类似于PlayButton.png
或playButton.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
一样,或者在你知道已经创建的方法中用!强制解开它
(我不确定,还在学习语言......: - )