我有一个计算器类,第一个用于插入值的ViewController和第二个用于显示计算结果的ViewController。不幸的是,如果我点击按钮,我会收到一个名为“无法解开Optional.None”的错误。我知道语法有问题,但我不知道如何改进它。
第一个Viewcontroller中的按钮在故事板中设置为“Segue:Show(例如Push)”,如果他被轻击,则切换到secondViewController。
计算器类类似于:
class Calculator: NSObject {
func calculate (a:Int,b:Int) -> (Int) {
var result = a * b
return (result)
}
}
Viewcontroller调用该函数,插入一个/ b并想要更改位于secondviewcontroller中的标签:
class ViewController: UIViewController {
@IBAction func myButtonPressed(sender : AnyObject) {
showResult()
}
var numberOne = 4
var numberTwo = 7
var myCalc = Calculator()
func showResult () {
var myResult = myCalc.calculate(numberOne, b: numberTwo)
println("myResult is \(String(myResult))")
var myVC = secondViewController()
myVC.setResultLabel(myResult)
}
这是secondViewController的代码
class secondViewController: UIViewController {
@IBOutlet var myResultLabel : UILabel = nil
func setResultLabel (resultValue:Int) {
myResultLabel.text = String(resultValue)
}
init(coder aDecoder: NSCoder!)
{
super.init(coder: aDecoder)
}
答案 0 :(得分:16)
在Swift中,默认情况下一切都是公开的。 在类之外定义变量:
import UIKit
var placesArray: NSMutableArray!
class FirstViewController: UIViewController {
//
..
//
}
然后访问它
import UIKit
class TableViewController: UITableViewController {
//
placesArray = [1, 2, 3]
//
}
答案 1 :(得分:3)
此处的问题是FirstViewController
没有引用SecondViewController
的实例。因此,这一行:
secondViewController.setResultLabel(myResult)
什么都不做(除了可能导致Can't unwrap Optional.None
错误)。有几种方法可以解决这个问题。如果您使用的是故事板segues,则可以使用-prepareForSegue
UIViewController
方法。这是一个例子:
在FirstViewController中:
override func prepareForSegue(segue: UIStoryboardSegue!,sender: AnyObject!){
//make sure that the segue is going to secondViewController
if segue.destinationViewController is secondViewController{
// now set a var that points to that new viewcontroller so you can call the method correctly
let nextController = (segue.destinationViewController as! secondViewController)
nextController.setResultLabel((String(myResult)))
}
}
注意:此代码不会按原样运行,因为该函数无法访问结果变量。你必须自己解决这个问题:)
答案 2 :(得分:0)
我认为这里的问题是,您正在尝试设置UI组件(此处,标签为:myResultLabel)
当从第一个视图控制器触发segue时,第二个视图尚未初始化。换句话说,UI对象“myResultLabel”仍为零。
要解决此问题,您需要在第二个控制器中创建一个本地字符串变量。现在,将该字符串设置为您要显示的内容,最后在第二个控制器的“viewDidLoad()”中设置实际标签。
最诚挚的问候, Gopal Nair。