Passar variables ​​de um ViewController para outro no Swift

Eu tenho uma class de calculadora, um primeiro ViewController para inserir os valores e um segundo ViewController para mostrar o resultado do cálculo. Infelizmente eu recebo um erro chamado “Não é possível desembrulhar Optional.None” se eu clicar no botão. Eu sei que há algo errado com a syntax, mas não sei como melhorá-la.

O botão no primeiro Viewcontroller é definido como “Segue: Show (por exemplo, Push)” no storyboard para alternar para o secondViewController se ele for tocado.

a class da calculadora é algo como:

class Calculator: NSObject { func calculate (a:Int,b:Int) -> (Int) { var result = a * b return (result) } } 

O Viewcontroller chama a function, insere a / b e deseja alterar o label que está localizado no 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) } 

E aqui está o código do 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) } 

No Swift, tudo é público por padrão. Defina suas variables ​​fora das classs:

 import UIKit var placesArray: NSMutableArray! class FirstViewController: UIViewController { // .. // } 

e depois acessá-lo

 import UIKit class TableViewController: UITableViewController { // placesArray = [1, 2, 3] // } 

O problema aqui é que o FirstViewController não tem referência para a instância do SecondViewController . Por isso, esta linha:

 secondViewController.setResultLabel(myResult) 

não faz nada (exceto provavelmente causando o erro Can't unwrap Optional.None ). Existem algumas maneiras de resolver esse problema. Se você estiver usando segues de storyboard, você pode usar o método UIViewController do UIViewController . Aqui está um exemplo:

No 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))) } } 

Nota: este código não será executado porque a function não tem access à variável de resultado. você terá que descobrir isso sozinho 🙂

Eu acho que o problema aqui é, você está tentando definir o componente de interface do usuário (aqui, é o label: myResultLabel)

Quando segue é triggersdo do primeiro controlador de visão, a segunda visão ainda não foi inicializada. Em outras palavras, o object da interface do usuário “myResultLabel” ainda é nulo.

Para resolver isso, você precisará criar uma variável de string local no segundo controlador. Agora, defina essa cadeia para o que você está tentando exibir e, finalmente, defina o label real em “viewDidLoad ()” do segundo controlador.

Atenciosamente, Gopal Nair.