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

Dan*_*ing 6 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)
    }
}
Run Code Online (Sandbox Code Playgroud)

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)
}
Run Code Online (Sandbox Code Playgroud)

这是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)
}
Run Code Online (Sandbox Code Playgroud)

RM *_*Vos 16

在Swift中,默认情况下一切都是公开的.在类之外定义变量:

import UIKit

var placesArray: NSMutableArray!

class FirstViewController: UIViewController {
//
..
//
}
Run Code Online (Sandbox Code Playgroud)

然后访问它

import UIKit

class TableViewController: UITableViewController {
//
placesArray = [1, 2, 3]
//
}
Run Code Online (Sandbox Code Playgroud)


67c*_*ies 3

这里的问题是FirstViewController没有引用 的实例SecondViewController。因此,这一行:

secondViewController.setResultLabel(myResult)
Run Code Online (Sandbox Code Playgroud)

什么都不做(除了可能导致错误Can't unwrap Optional.None)。有几种方法可以解决这个问题。如果您使用故事板segues,您可以使用-prepareForSegue的方法UIViewController。这是一个例子:

在第一个视图控制器中:

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)))
  }
}
Run Code Online (Sandbox Code Playgroud)

注意:此代码不会按原样运行,因为该函数无法访问结果变量。你必须自己弄清楚:)