将两个变量传递给同一个视图控制器swift

时间:2017-05-14 22:33:38

标签: ios swift uitableview segue

我想将两个不同的数据从两个不同的视图控制器(Table1VC - Table2VC)传递给一个扩展(MainVC)..

我做到了并且有效..但问题是:

当我传递第一个数据时,这里没有问题 但问题是,当我传递第二个数据时,第一个数据消失!!

这是我到目前为止所做的:

表1VC:

import UIKit

class Table1ViewController: UIViewController , UITableViewDelegate , UITableViewDataSource{

@IBOutlet weak var tableview: UITableView!
var city = ["data1" , "data2" , "Data3"]

var passit = ""

override func viewDidLoad() {
    super.viewDidLoad()

    tableview.delegate = self
    tableview.dataSource = self

    self.navigationController?.navigationBar.tintColor = UIColor.orange

}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return city.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = UITableViewCell()

    cell.textLabel?.text = city[indexPath.row]

    return cell
}


func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    passit = city[indexPath.row]
    performSegue(withIdentifier: "showtable1", sender: city[indexPath.row])
}


override func prepare(for segue: UIStoryboardSegue, sender: Any?){
    let passData1 = segue.destination as! MainVC
        passData1.passcity1 = passit

    }



}

Table2VC

import UIKit

class passVC: UIViewController , UITableViewDelegate , UITableViewDataSource{

@IBOutlet weak var tableView: UITableView!
   var city2 = ["data1" , "data2" , "Data3"]


var passit = ""

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.delegate = self
    tableView.dataSource = self

    self.navigationController?.navigationBar.tintColor = UIColor.orange

}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return city2.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = UITableViewCell()

    cell.textLabel?.text = city2[indexPath.row]

    return cell
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    passit = city2[indexPath.row]

    performSegue(withIdentifier: "showtable2", sender: city2[indexPath.row])
}


override func prepare(for segue: UIStoryboardSegue, sender: Any?){
    let passData2 = segue.destination as! MainVC
    passData2.passcity2 = passit

}



}

MainVC

import UIKit

class MainVC: UIViewController {

@IBOutlet weak var passText1: UITextField!
@IBOutlet weak var passText2: UITextField!



var passcity1 = ""
var passcity2 = ""

override func viewDidLoad() {
    super .viewDidLoad()



    passText1.text = passcity1
    passText2.text = passcity2


}

}

传递的数据将在MainVC的文本字段中

1 个答案:

答案 0 :(得分:0)

这有点像他查看堆栈的基础知识和视图问题的生命周期。 当您键入行时:

let passData1 = segue.destination as! MainVC

这意味着你想要制作MainVC的一个实例,并希望填充那个对象的数据。

当您转向该控制器并返回主控制器时,您丢失了具有第一个值的先前对象。

实施例: 来自VC1: let passData1 = segue.destination as! MainVC - >意味着告诉编译器让我成为对象名称“passData1”,在此之后对 passData1 执行的任何操作都将影响passData1

来自VC2: let passData2 = segue.destination as! MainVC - >意味着告诉编译器让我成为对象名称“passData2”,然后在 passData2 上执行的任何操作都将影响passData2

总而言之,您的对象已更改,因此对象的先前状态将丢失。您第一次导航出MainVC的瞬间,下次创建任何MainVC对象时,它是MainVC的新副本。您需要设置value1和value2。

如果你想保持passData1的值,那么在某处保存所需的值,当传递passData2时,获取这些值并传递完整的集合。