写入境界(成功),转入下一个VC(成功),并显示保存在境界的前一个VC的字符串数据(需要帮助)。

问题描述 投票:0回答:1

我有一个条形按钮功能,叫做 saveTapped 在...上 FirstVC. 当这一功能被攻克时,我有一些字符串数据被成功地写入到一个境界数据库。

我正在尝试

  1. 获取 saveTapped 按键将数据写入境界(这是在工作)
  2. 一旦将数据写入境界,要转入到 NextVC 视图控制器(这是工作的,有一个标识符的转折点 saveTappedSegue 直接从 FirstVC)

以此

  1. 将刚刚保存到境界数据库中的信息显示在 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 的数据,以使其易于访问?我才刚刚知道如何保存到 realm,所以这是我第一次尝试从 realm 中读取数据到显示。

ios swift button realm segue
1个回答
1
投票

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

另一种方法是通过对象来代替。


0
投票

你可以从下一个VC中再次查询数据库,但鉴于你已经有了数据,那就太矫枉过正了。

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

如果你有一个快速的谷歌,有许多Swift依赖注入的教程。

© www.soinside.com 2019 - 2024. All rights reserved.