首页 > 解决方案 > 写入领域(成功),继续到 NextVC(成功)并显示保存到领域的先前 VC 的字符串数据(需要帮助)

问题描述

我有一个saveTappedFirstVC. 当点击它时,我有许多字符串数据被成功写入领域数据库。

我正在尝试

  1. 获取将saveTapped数据保存/写入领域的按钮(这是有效的)
  2. 将数据写入领域后,转至NextVC视图控制器(这是有效的,带有saveTappedSegue直接来自 的标识符的转接FirstVC

到那时

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

我有以下代码布局;

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 步工作成功。

我希望将刚刚保存到领域的信息显示在NextVC以下标签上;

NextVCLabel1
NextVCLabel2
NextVCLabel3 etc etc.

我目前正在查看第三步并删除错误以允许 UITextFields 显示在 NextVC 标签上。我在某处读过我可能需要时间戳的地方,或者ID在保存数据以使其易于访问时给予数据?我只是想出了如何保存到领域,所以这是我第一次尝试从领域读取数据以显示。

标签: iosswiftbuttonrealmsegue

解决方案


你有几种方法可以做到这一点。您可以在 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
        }
    }

另一种方法是传入对象。


推荐阅读