当我从第二个视图控制器返回时,如何将数据保存在文本字段中



我正在处理一个注册表单,当我回到第一个视图控制器时,我必须从另一个视图控制器获取一些数据,我在文本字段中存储的数据是空白的。我没有和sugues打过交道。我提到了代码中可能出现错误的重要部分。

class RegisterVC: UIViewController{
@IBAction func emergencyContactTapped(_ sender: Any) {
let vc = UIStoryboard.init(name: "Main",  bundle:Bundle.main).instantiateViewController(withIdentifier: "EmergencyContactVC") as? EmergencyContactVC
self.navigationController?.pushViewController(vc!, animated: true)

当我从conatactsController返回时,我在RegisterVC中保存的所有数据都不见了

import UIKit
class EmergencyContactVC: UIViewController{
@IBAction func backTapped(_ sender: Any) {
let vc = UIStoryboard.init(name: "Main", bundle: Bundle.main).instantiateViewController(withIdentifier: "RegisterVC") as? RegisterVC
vc?.phoneText = self.numberArray
self.navigationController?.pushViewController(vc!, animated: true)
}

当您instantiateViewController时,它将为RegisterVC创建一个新对象。

你试过这个吗:

@IBAction func backTapped(_ sender: Any) {
if let navController = self.navigationController {
navController.popViewController(animated: true)
}
}

使用NSUserDefaults,可以轻松地对小型信息进行持久存储。。

let defaults = NSUserDefaults.standardUserDefaults()
defaults.setObject(yourString, forKey: "yourKey")

可通过检索

var retrievedString = defaults.objectForKey("yourKey") as? String

@Harish的答案可能是一个很好的解决方案,但由于用户默认值将永远存储这些数据(即使您将关闭应用程序并再次打开它(,另一个好的解决方法可能是声明一个全局变量,因此即使您更改viewController然后返回,这些数据也会被存储和使用,但如果您关闭应用程序,这些数据将不会被存储。如下声明作用域外(类外(的变量:

var abc: String!
class etc... {
abc = "Your Text"
}

这是一个示例,因此您可以在另一个视图控制器中使用它,然后在回来时再次使用它。

首先,在您的示例中,RegisterVCEmergencyContactVCEmergencyContactVCRegisterVC。您还提到了contactsController,但尚不清楚这三者应该如何交互/流动。似乎backTapped应该是popViewController,而不是再次实例化。

无论如何,当VC1推送VC2时,有两种适当的模式可以将数据从VC2传递到VC1:delegate和segues。

  1. Delegate:这定义了VC1和VC2之间的通信路径,允许VC2在VC1中的方法消失之前调用它。与segues相比,协议的优势在于,它们可以在视图控制器的生命周期中的任何时间、单元格和表视图之间使用。在几个相关的视图控制器之间传递数据时,可以使用委托

在VC2中,添加协议和属性:

protocol VC2Protocol {
func set( name: String? )
}
class VC2: UIViewController {
var delegate: VC2Protocol!
var nameEnteredByUser: String?
...
}

在VC1中,声明您想要接收的属性,并在您想要推送VC2的地方,将VC1分配为委托:

class VC1: UIViewController {
var name: String?
...
func pushVC2() {
if let vc2 = UIStoryboard.init(name: "Main", bundle: Bundle.main).instantiateViewController(withIdentifier: "VC2") as? VC2 {
vc2.delegate = self
navigationController?.pushViewController( vc2, animated: true )
}
}
}

最后在VC1中,您需要实现协议:

extension VC1: VC2Protocol {
func set( name: String? ) {
self.name = name
}
}

最后,在VC2中,在弹出返回到VC1之前,使用委托将数据从VC2传递到VC1,而VC2仍然有效:

extension VC2 {
func popVC2() {
delegate.set( name: nameEnteredByUser )
navigationController?.popViewController( animated: true )
}
}
  1. Segue:当使用Segue时,您可以在推送和弹出(或呈现和驳回(之前执行代码,并引用VC1和VC2

网上有许多关于使用segues的详细教程。为了将数据传回,诀窍是创建一个展开段,以便在将VC2弹出到VC1时调用。在VC1中,你会有这样的东西:

func unwindToVC1( _ segue: UIStoryboardSegue ) {
if let vc2 = segue.source as? VC2 {
self.name = vc2.nameEnteredByUserInVC2
}
}

您还可以使用VC1中的override func prepare( for segue: UIStoryboardSegue, sender: Any? )将数据从VC1传递到VC2。

最新更新