我正在尝试创建一个简单的应用程序,该应用程序由一个导航控制器组成,其中两个屏幕由一个UIViewController类控制。该应用程序将允许用户在文本字段中输入0到10之间的数字,当用户按下按钮时,他们将被带到第二个屏幕,显示他们是否猜到了随机生成的数字。当我在第二个屏幕中访问标签的text属性时,我得到“在展开可选值时意外发现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.
}
}
这是我的Generic View控制器类:
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.
}
}
答案 0 :(得分:2)
从
改变var generatedRanNumber = (parentViewController as! MyNavController).ranNum
到
var generatedRanNumber = (navigationController as! MyNavController).ranNum
还注意到arc4random_uniform(10)
返回0到9之间的数字。您告诉用户猜测0到10之间的数字。
答案 1 :(得分:1)
实际上问题是你正在从一个通用视图控制器实例推送到另一个实例而不传递数据。通常不建议以这种方式使用UIViewController的通用子类。如果您希望代码按原样工作,请将UILabel放在与其他UI相同的视图中,并且不要进行segue(即只有一个GenericViewController实例)。或者创建UIViewController的两个子类,一个名为“GuessViewController”,另一个名为“AnswerViewController”,并在prepareForSegue中传递它们之间的猜测值。 GuessViewController将处理从用户获取字符串并进行评估。 AnswerViewController会判断它是对还是错。通常也没有必要继承UINavigationController。您可以将该代码放在GuessViewController的viewDidLoad中。