Ios 导航控制器和记忆值

Ios 导航控制器和记忆值,ios,swift,uiviewcontroller,uinavigationcontroller,Ios,Swift,Uiviewcontroller,Uinavigationcontroller,我有两个视图控制器和导航控制器。第一视图控制器有4个文本字段,第二视图控制器有4个文本字段。要将第一视图控制器导航到第二视图控制器,我使用以下代码: let storyboard = UIStoryboard(name: "Main", bundle: nil) var destinationVC:UIViewController destinationVC = storyboard.instantiateViewController(withIdentifier: "SecondVC") as

我有两个视图控制器和导航控制器。第一视图控制器有4个文本字段,第二视图控制器有4个文本字段。要将第一视图控制器导航到第二视图控制器,我使用以下代码:

let storyboard = UIStoryboard(name: "Main", bundle: nil)
var destinationVC:UIViewController
destinationVC = storyboard.instantiateViewController(withIdentifier: "SecondVC") as! SecondVC
navigationController?.show(destinationVC, sender: self)
从我正在使用的第二视图控制器到第一视图控制器

navigationController?.popViewController(animated: true)

然而,即使我在first view controller中填写的字段在我从第一个值转到第二个值时保留了这些值,由于popviewcontroller方法,这些值也会消失。记住second view controller中的值的最佳方法是什么?

当viewController消失并加载到viewDidLoad时,您可以使用second view controller中的键值存储来保存数据。或者将数据保存在某个结构/对象实例中,并在按下secondViewController时传递数据。

您可以使用singleton将值存储为字典(或其他内容)

当弹出时,在控制器中

Settings.shared.dictionaryToStore = {"key1": textfield1.text, "key2": textfield2.text, ...  
}
viewDidLoad

override func viewDidLoad() {
    super.viewDidLoad()
    textfield1.text = Settings.shared.dictionaryToStore["key1"]
    textfield2.text = Settings.shared.dictionaryToStore["key2"]
    ...
}
您还可以创建自定义对象并将其存储

编辑1** 若要在应用程序终止后使用变量,可以将字典保存在UserDefaults中

class Settings: NSObject {
   static let shared = Settings()

   public var dictionaryToStore: [String: String]? {
    set(newValue) {
        let defaults = UserDefaults.standard
        defaults.set(newValue, forKey: "SomeKey")
    }
    get {
        let defaults = UserDefaults.standard
        let loadedValue = defaults.object(forKey: "SomeKey")
        return loadedKey
    }
}

   private init() {
      super.init()
   }
}

在SecondVC上无法记住值的关键原因是每次打开SecondVC时都会使用它的新实例

因此,您最好在FirstVC开头的某个地方创建一次SecondVC的实例(代码的前3行执行该任务),每次需要显示SecondVC时,都在
show()
func中使用它,而不是每次都创建多个SecondVC实例


在这种情况下,您将在SecondVC中看到所有“记住”的值。

如果您想将数据从第一视图控制器传递到第二视图

在上面的代码中,尽管您正在创建视图控制器的新实例,但您仍然可以通过在第一个视图控制器中设置第二个视图控制器的变量来传递数据

navigationController?.show(destinationVC, sender: self)

然后

navigationController?.show(destinationVC, sender: self)
然后在第二个视图中,控制器使用该变量来使用值

因此,您可以如何将数据从第一个控制器传递到第二个视图控制器


现在,如果您想将数据从第二个viewController传递到第一个controller,那么您可以使用委托

问题不在于存储和加载值,而在于作者所做的事情的错误逻辑和错误的预期。感谢您的有益评论,我还需要问一件事,那就是如果我们关闭应用程序,变量会保存在存储中吗?@swifftstudier你能告诉我哪里是我的错误逻辑,这样我就可以开发它了吗?当然。唯一的错误是使用SecondVC的不同实例,同时希望保存其中的所有更改以供第二次或第三次访问。这就像在某个实例上执行一些更改,然后创建并显示一个新实例,并期望来自第一个实例的更改出现在另一个实例上—这种方式不起作用。而且,
dictionaryToStore
-示例在应用程序终止后不起作用,因为所有数据都存储在应用程序内存中-它应该存储(稍后加载)在数据库(coredata、realm等)中,或者,如果值很少,可以使用UserDefault。因此,如果我在viewDidLoad函数中创建前3行,当我使用popViewController时,它们不会消失吗?不会,它们会消失。您的
var destinationVC
内容必须放在第一个VC的全局范围内,而不是像viewDidLoad这样的特定函数中。由于您在FirstVC中创建了一个SecondVC实例,请将其保留很长时间,并在任何时候显示SecondVC(而不是初始化新实例)时使用它,因此一切都会很好,提交给SecondVC中textField的所有更改都不会丢失。这是一个快速制作的演示,谢谢你的演示。现在我明白了,它很有帮助。
destnationVC.variableTOSet = valueTopass
navigationController?.show(destinationVC, sender: self)