【问题标题】:found nil while unwrapping optional在展开可选时发现 nil
【发布时间】:2015-11-08 07:10:16
【问题描述】:

我正在尝试创建一个简单的应用程序,它由一个导航控制器和两个由单个 UIViewController 类控制的屏幕组成。该应用程序将允许用户在文本字段中输入从 0 到 10 的数字,当用户按下按钮时,他们将被带到第二个屏幕,显示他们是否猜到了随机生成的数字。当我在第二个屏幕中访问标签的文本属性时,出现“在展开可选值时意外发现 nil”错误。我不明白为什么,我已将标签与班级联系起来。有什么建议吗?

这是我的用户界面:

这是我的导航控制器类代码:

class MyNavController: UINavigationController {
var ranNum:Int = 0

override func viewDidLoad() {
    super.viewDidLoad()

    ranNum = (Int)(arc4random_uniform(10))

    NSLog("random number: \(ranNum)")
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

}

这是我的通用视图控制器类:

class GenericViewController: UIViewController {
@IBOutlet weak var inputTextField: UITextField!
@IBOutlet weak var outputLabel: UILabel!

var setThisLabel: String = "You Win!"

@IBAction func guessTheNumber(sender: AnyObject) {
    var generatedRanNumber = (parentViewController as! MyNavController).ranNum
    var userGuessNumer = inputTextField.text.toInt()

    if generatedRanNumber == userGuessNumer {
        outputLabel.text = "You Win!"
    } else if generatedRanNumber < userGuessNumer {
        outputLabel.text = "Think Less..."
    } else {
        outputLabel.text = "Think Big..."
    }
}
override func viewDidLoad() {
    super.viewDidLoad()

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

}

【问题讨论】:

标签: ios swift


【解决方案1】:

改变

var generatedRanNumber = (parentViewController as! MyNavController).ranNum

var generatedRanNumber = (navigationController as! MyNavController).ranNum

还要注意arc4random_uniform(10) 返回一个介于 0 和 9 之间的数字。您告诉用户猜测一个介于 0 和 10 之间的数字。

【讨论】:

  • 感谢您的建议。我做了更改,但问题仍然存在:/ 我将尝试创建两个不同的 UIViewController 类并使用 prepareForSeguey 方法。正如 -beyowulf 建议的那样
【解决方案2】:

实际上,问题是您在没有传递数据的情况下从一个通用视图控制器实例推送到另一个实例。一般不建议以这种方式使用 UIViewController 的泛型子类。如果您希望您的代码按原样工作,请将 UILabel 放置在与您的其他 UI 相同的视图中并且不要 segue(即只有一个 GenericViewController 实例)。或者创建 UIViewController 的两个子类,一个称为“GuessViewController”,另一个称为“AnswerViewController”,并在 prepareForSegue 中传递它们之间的猜测值。 GuessViewController 将处理从用户那里获取字符串并对其进行评估。 AnswerViewController 会不管它是对是错。通常也不需要子类 UINavigationController。您可以将该代码放在 GuessViewController 的 viewDidLoad 中。

【讨论】:

  • 您的一些建议是对的。但我不会说 这实际上是问题 导致“在展开可选值时意外发现 nil”... :)
  • 我把他所有的代码都放在了Xcode中,只出现了segue错误。
  • 感谢您的推荐。我现在试一试。 :)
  • 是的。我的错。我忽略了一些东西...... :)
  • 使用 prepareforsegue + 为两个屏幕使用两个不同的实例确实可以完美地工作。谢谢! :)
猜你喜欢
  • 2016-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多