写入领域(成功),转至 NextVC(成功)并显示保存到领域的先前 VC 中的字符串数据(需要帮助)

Write to realm (successful), segue to NextVC (successful) and display string data from previous VC that was saved to realm (need help)

我在 FirstVC 上有一个名为 saveTapped 的条形按钮函数。当点击它时,我有一些字符串数据被成功写入领域数据库。

我正在尝试

  1. 获取 saveTapped 按钮以 save/write 数据到领域(这是有效的)
  2. 一旦数据被写入领域,就可以连接到 NextVC 视图控制器(这是有效的,带有标识符 saveTappedSegue 的连接直接来自 FirstVC

到那时

  1. 显示NextVC中刚刚保存到Realm数据库中的信息。

我有以下代码布局;

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "saveTappedSegue" {
            let dest = segue.destination as! NextVC

            dest.NextVCLabel1.text = UITextField1.text // Errors thrown here
            dest.NextVCLabel2.text = UITextField2.text etc.etc.

    }
}

@IBAction func saveTapped(_ sender: Any) {
        let realm = try! Realm()

    var realmClassName = RealmClassToInheritFrom()
        realmClassName.classProperty1 = UITextField1.text
        realmClassName.classProperty2 = UITextField2.text
        realmClassName.classProperty3 = UITextField3.text etc. etc.

        try! realm.write {
            realm.add(realmClassName)
        }

       self.performSegue(withIdentifier: "saveTappedSegue", sender: self)

    }

错误是"Thread 1: Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value"

我已成功完成第 1 步和第 2 步。

我想把刚才的信息存入realm,显示在NextVC下面的标签中;

NextVCLabel1
NextVCLabel2
NextVCLabel3 etc etc.

我目前正在查看第三步并删除错误以允许 UITextFields 显示在 NextVC 标签上。我在某处读到我可能需要时间戳,或者在数据保存时给它一个 ID 以便于访问?我刚刚弄清楚如何保存到领域,所以这是我第一次尝试从领域读取数据以显示。

您可以从下一个 VC 开始再次查询数据库,但如果您已经有了数据,那就太过分了。

使用func prepare(for segue: UIStoryboardSegue, sender: Any?)方法将当前viewcontroller的数据注入下一个

Swift 依赖注入有很多教程,如果你有一个快速 google。

您有多种方法可以做到这一点。您可以在 prepareForSegue 内执行所有逻辑,或者在 saveTapped 内执行一些逻辑,在 prepareForSegue 内执行一些逻辑。例如,第一种方法如下所示:

  • 您的 saveTapped 函数只有一条语句 - performSegue。
    @objc func saveTapped(_ sender: UIBarButtonItem) {
           self.performSegue(withIdentifier: "saveTappedSegue", sender: self)
    }
  • 在 NextVC 中,为每个标签声明一个变量,并在 viewDidLoad 上将每个变量的值分配给其对应的标签:
    class NextVC: UIViewController {

        // Labels        
        @IBOutlet weak var label1: UILabel!
        @IBOutlet weak var label2: UILabel!

        // String variables
        var string1 = ""
        var string2 = ""

        override func viewDidLoad() {
            super.viewDidLoad()
            // Assign each string variable's content to its corresponding label
            label1.text = string1
            label2.text = string2
        }
     }
  • 在FirstVC里面,我们来处理prepareForSegue里面需要实现的逻辑:
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        if segue.identifier == "NEXTVC_SEGUE_ID" {            
            let destination = segue.destination as! NextViewController
            // Let's write to realm first
            let realm = try! Realm()

            var realmClassName = RealmClassToInheritFrom()
            realmClassName.classProperty1 = UITextField1.text
            realmClassName.classProperty2 = UITextField2.text
            realmClassName.classProperty3 = UITextField3.text etc. etc.

            try! realm.write {
                realm.add(realmClassName)
            }

            // Now let's set the NextVC's string variables
            destination.string1 = UITextField1.text
            destination.string2= UITextField2.text
        }
    }

另一种方法是传入对象。