如何在swift中没有segue的视图控制器之间传递变量

时间:2018-02-18 19:47:45

标签: swift variables view controller

如何在没有segue或Swift导航栏的视图控制器之间传递变量?我尝试在类之外定义变量,但是变量被修改,因此当在另一个视图控制器中访问它们时,不会显示更新。我有5个视图控制器,每个都创建一个或两个新变量。我的目标是将这些变量传递给最后一个视图控制器,其中所有变量都显示在一个视图控制器上。

以下是一些代码示例:

class ViewController_name: UIViewController, UITextFieldDelegate {

    //MARK: Properties

    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var field_first: UITextField!
    @IBOutlet weak var field_last: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()
        self.field_first.delegate = self
        self.field_last.delegate = self
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    //MARK: Actions

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.view.endEditing(true)
    }

    func textFieldShouldReturn(_ textField: UITextField) -> Bool { //function tests for pressing return in a text field
        self.view.endEditing(true) //closes the keyboard
        return true
    }
    @IBAction func button_name(_ sender: UIButton) { //tests for button click
        let input_name_first:String = field_first.text! //sets the variable input to the first name text field
        let input_name_last:String = field_last.text! //sets the variable input to the last name text field
        print("\(input_name_first) \(input_name_last)") //prints the full name to console
    }
}

我无法通过segue执行此操作,因为视图控制器的顺序如下所示:

1 - &gt; 2 - &gt; 3 - &gt; 4 - &gt; 5

我需要从1到5获取数据。

View Controller 1中的代码将两个变量发送到View Controller 2.

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let name_pass_first = segue.destination as! ViewController_complete
        if let text = field_first.text  {
            name_pass_first.text = text
        }
        let name_pass_last = segue.destination as! ViewController_complete
        if let text1 = field_last.text {
            name_pass_last.text1 = text1
        }
    }

来自View Controller 2的代码,用于从View Controller 1接收变量:

override func viewDidLoad() {
super.viewDidLoad()
if let received_pass_first_name = text {
    print(received_pass_first_name)
}
if let received_pass_last_name = text1 {
    print(received_pass_last_name)
}
}

2 个答案:

答案 0 :(得分:0)

您可以采取以下几种方法:

  1. 最明显的一个(也是最丑陋的)是简单地将值作为属性从一个控制器传递到下一个控制器。
  2. 更好的方法是从CoreData等数据存储中访问值,或者如果值很小,则使用UserDefaults。通过使用此方法,您可以访问“&#39;之前的任何视图控制器的属性值”。当前的 - 在堆栈中。

答案 1 :(得分:0)

  

我无法通过segues执行此操作,因为视图控制器的序列如下所示:1 - &gt; 2 - &gt; 3 - &gt; 4 - &gt; 5,我需要从1到5获取数据

说&#34;不能&#34;#34;真傻。当然可以。你只是不断传递和积累信息,以便所需的一切都达到5.你只是意味着你不想要,要么是因为你认为它很难看,要么是因为你没有&# 39;我想花时间来实施它。

但为什么不呢?为什么不传递一个自定义对象,其中包含越来越多的所有需要​​的属性,并在需要时进行修改,因为它向下移动直到达到5?