我想将两个不同的数据从两个不同的视图控制器(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的文本字段中
答案 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时,获取这些值并传递完整的集合。