Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 将两个变量传递给同一视图控制器_Ios_Swift_Uitableview_Segue - Fatal编程技术网

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

Ios 将两个变量传递给同一视图控制器,ios,swift,uitableview,segue,Ios,Swift,Uitableview,Segue,我想将两个不同的数据从两个不同的视图控制器(Table1VC-Table2VC)传递到一个扩展(MainVC) 我这么做了,结果成功了。。但问题是: 当我传递第一个数据时,这里没有问题 但问题是当我传递第二个数据时,第一个数据就消失了 这就是我目前所做的: 表1VC: import UIKit class Table1ViewController: UIViewController , UITableViewDelegate , UITableViewDataSource{ @IBOutle

我想将两个不同的数据从两个不同的视图控制器(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

    }



}
表2VC

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

}



}
缅因州

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的textfield中

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

让passData1=segue.destination为!MainVC

这意味着您希望创建一个MainVC的实例,并希望填充该对象的数据

当您切换到该控制器并返回主控制器时,您就丢失了具有第一个值的前一个对象

例如: 从VC1:
让passData1=segue.destination为!MainVC
->意味着告诉编译器给我一个对象名“passData1”,之后对passData1执行的任何操作都只会影响passData1

从VC2:
让passData2=segue.destination为!MainVC
->意味着告诉编译器给我一个对象名“passData2”,之后对passData2执行的任何操作都只会影响passData2

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


如果要维护passData1的值,请将所需的值保存在某个位置,在传递passData2时,获取这些值并传递整个集合。

您不能从两个不同的视图控制器切换到同一个MainVC实例;每个segue将创建一个新实例。如果您的表视图用于选择要传回mainvc的值,那么您应该阅读展开段。感谢您提供的详细答案。。那么,我如何通过编程实现这一点呢?你想从main转到vc1,然后再回到main,然后再回到vc2,然后再回到main吗?没错……你需要定义流。。。。例如,如果你需要从MainVC中获取一个值并在Table1VC中使用它,那么就来回传递,然后不断地在这里和那里传递变量……但这只意味着你没有正确地得到需求,你的设计有缺陷。你需要做的是不要尝试在这里和那里传递值,确保你了解变量的范围。如果它们是应用程序范围内的变量,则使用UserDefaults完成任务。但是如果不是,那么你需要定义静态变量。关于这个有什么变化吗?