【问题标题】:pass two variables to the same view Controller swift将两个变量传递给同一个视图控制器 swift
【发布时间】:2017-05-14 22:33:37
【问题描述】:

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

}



}

主VC

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 的文本字段中

【问题讨论】:

  • 你不能从两个不同的视图控制器中切换到同一个 MainVC 实例;每个 segue 都会创建一个新实例。如果你的表视图用于选择一个你想要传递 back 到 mainvc 的值,那么你应该阅读 unwind segues。

标签: ios swift uitableview segue


【解决方案1】:

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

let passData1 = segue.destination as! MainVC

这意味着您想要创建 MainVC 的 一个 实例并想要填充 那个 对象的数据。

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

示例: 从 VC1: let passData1 = segue.destination as! MainVC -> 表示告诉编译器给我一个对象名“passData1”,之后对 passData1 所做的任何操作都会影响 passData1 only

来自 VC2: let passData2 = segue.destination as! MainVC -> 表示告诉编译器给我一个对象名称“passData2”,之后对 passData2 所做的任何操作都会影响 passData2 only

总而言之,您的对象已更改,因此该对象的先前状态丢失了。当您第一次离开 MainVC 时,下一次创建任何 MainVC 对象时,它都会是 MainVC 的新副本。您需要同时设置 value1 和 value2。

如果你想保持passData1的值,那么把需要的值保存在某个地方,在传递passData2的时候,获取那些值并传递完整的集合。

【讨论】:

  • 感谢您提供详细的答案。那么,我该如何以编程方式执行此操作?
  • 是否要从 main 转到 vc1,然后返回到 main,然后到 vc2,然后返回到 main?
  • 正是......你需要定义流程......例如如果您需要从 MainVC 中获取一个值并在 Table1VC 中使用它然后来回走动,然后一直在这里和那里传递变量....但这只是意味着您并没有真正正确地满足要求并且您的设计有缺陷。
  • 你需要做的不是试图在这里和那里传递值,而是确保你了解变量的范围。如果它们是应用程序范围的变量,则使用 UserDefaults 来完成工作。但如果不是,那么您将需要定义静态变量。
  • 对此有何动静?
猜你喜欢
  • 1970-01-01
  • 2015-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-28
  • 1970-01-01
  • 2021-12-20
相关资源
最近更新 更多