在展开可选值 (UIButton) 时意外发现 nil

Posted

技术标签:

【中文标题】在展开可选值 (UIButton) 时意外发现 nil【英文标题】:Unexpectedly found nil while unwrapping an Optional value (UIButton) 【发布时间】:2015-06-27 18:48:38 【问题描述】:

我正在尝试以编程方式创建一个按钮并将其添加到 Swift 中的 UIScrollView。下面的代码是我正在使用的代码,并在我将按钮添加为子视图时抛出了臭名昭著的“展开可选错误”。为什么要这样做?我检查了我的代码并将其与其他人的代码进行了比较,一切看起来都很好。

let button = UIButton.buttonWithType(UIButtonType.System) as UIButton
button.frame = CGRectMake(8, 2, 200, 300)
button.backgroundColor = UIColor.grayColor()
button.setTitle(productName, forState: UIControlState.Normal)
self.productButtonView.addSubview(button) //This line throws error

提前谢谢你。

【问题讨论】:

【参考方案1】:

The as! Operator - developer.apple.com/swift/blog

Swift 1.2 将保证转换和强制转换的概念分离为两个不同的运算符。保证转换仍然使用as 运算符执行,但强制转换现在使用as! ...在 Swift 中这些运算符的模式可能最容易记住:! 表示“这可能会陷入陷阱”,而? 表示“这可能为零。”

Swift 2 版本(Xcode7 beta 2):

let button = UIButton(type: .System) as UIButton
// see that the way we do this has changed

button.frame = CGRectMake(8, 2, 200, 300)
button.backgroundColor = UIColor.grayColor()
button.setTitle(productName, forState: UIControlState.Normal)
self.productButtonView.addSubview(button)

Swift 1.2 版本(Xcode 6.3.2):

let button = UIButton.buttonWithType(UIButtonType.System) as! UIButton

button.frame = CGRectMake(8, 2, 200, 300)
button.backgroundColor = UIColor.grayColor()
button.setTitle(productName, forState: UIControlState.Normal)
self.productButtonView.addSubview(button)

【讨论】:

现在我可以使用 XCode 6.3.2 编写多行代码,我意识到我的“productButtonView”是 nil。你的回答是正确的,谢谢。也许这个步骤超出了这个线程的边界,但是我需要做的不仅仅是创建一个 UIScrollView(在故事板中)并将它连接到一个插座以便使用它吗? 理论上你所描述的应该有效。所以我不知道该建议什么。假设productButtonView 在这种情况下绝对是self 的子视图,并且@IBOutlet 肯定是正确连接的。可能值得开始一个新问题并发布整个视图控制器代码+问题描述,看看是否有人能弄清楚为什么你会得到nil 解决了,由于某种原因它没有连接 - 我很傻。无论如何,谢谢。【参考方案2】:

尝试修复第一行(as!)

 let button = UIButton.buttonWithType(UIButtonType.System) as! UIButton

【讨论】:

这会引发错误:“'as' 之后的预期类型”。 :( 您使用的是哪个版本的 Xcode?如果你使用的是旧的,那么写成?我相信。我使用的是 6.3.2 版,如果我写“as”会出错。它必须是“as!”或“作为?”。 我使用的是 XCode 版本 6.1.1。我试着写“as?”,但这迫使我写一个“!”每次我使用“按钮”变量之后,最终还是抛出了同样的错误。即将切换到 6.3.2。 在将按钮添加到屏幕之前执行此检查。 if let buttonIsOk = button self.view.addSubview(button!) else println("我的按钮确实是 nil!")

以上是关于在展开可选值 (UIButton) 时意外发现 nil的主要内容,如果未能解决你的问题,请参考以下文章

UITableViewCell 中的 AVPlayer 导致“在隐式展开可选值时意外发现 nil”错误

UIPickerView:在展开可选值时意外发现 nil

致命错误:在展开可选值时意外发现 nil - 为啥?

prepareForSegue 出错“”在展开可选值时意外发现 nil“”

Alamofire:在展开可选值时意外发现 nil

JSON 致命错误:在展开可选值 (llbd) 时意外发现 nil