在Swift中将变量从一个ViewController传递给另一个

时间:2014-06-04 17:44:38

标签: swift

我有一个计算器类,第一个用于插入值的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)
}

3 个答案:

答案 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。