Передать переменные из одного ViewController в другой в Swift

У меня есть класс калькулятора, первый ViewController для вставки значений и второй ViewController, чтобы показать результат вычисления. К сожалению, я получаю сообщение об ошибке "Невозможно развернуть Необязательный. Нет", если я нажму кнопку. Я знаю, что что-то не так с синтаксисом, но я не знаю, как его улучшить.

Кнопка в первом Viewcontroller установлена ​​в "Segue: Show (например, Push)" в раскадровке, чтобы переключиться на secondViewController, если он будет прослушан.

класс калькулятора выглядит примерно так:

class Calculator: NSObject {

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

Viewcontroller вызывает эту функцию, вставляет a/b и хочет изменить метку, расположенную во втором контролере:

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

И вот код второгоViewController

class secondViewController: UIViewController {

@IBOutlet var myResultLabel : UILabel = nil

func setResultLabel (resultValue:Int) {
    myResultLabel.text = String(resultValue)
}

init(coder aDecoder: NSCoder!)
{
    super.init(coder: aDecoder)
}

Ответ 1

В Swift все по умолчанию открыто. Определите переменные вне классов:

import UIKit

var placesArray: NSMutableArray!

class FirstViewController: UIViewController {
//
..
//
}

а затем получить доступ к нему

import UIKit

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

Ответ 2

Проблема здесь в том, что FirstViewController не имеет ссылки на экземпляр SecondViewController. Из-за этого эта строка:

secondViewController.setResultLabel(myResult)

ничего не делает (за исключением, вероятно, возникновения ошибки Can't unwrap Optional.None). Есть несколько способов решить эту проблему. Если вы используете раскладки раскадров, вы можете использовать метод -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)))
  }
}

Примечание: этот код не будет запущен, так как функция не имеет доступа к переменной результата. вам придется это выяснить самостоятельно:)

Ответ 3

Я думаю, что проблема здесь в том, что вы пытаетесь установить компонент пользовательского интерфейса (здесь, его метка: myResultLabel)

Когда segue запускается из контроллера первого вида, второе представление еще не инициализировано. Другими словами, объект пользовательского интерфейса "myResultLabel" по-прежнему равен нулю.

Чтобы решить эту проблему, вам нужно будет создать локальную строковую переменную во втором контроллере. Теперь установите эту строку на то, что вы пытаетесь отобразить, и, наконец, установите фактическую метку в "viewDidLoad()" второго контроллера.

С наилучшими пожеланиями, Гопал Наир.