我有一个条形按钮功能,叫做 saveTapped
在...上 FirstVC
. 当这一功能被攻克时,我有一些字符串数据被成功地写入到一个境界数据库。
我正在尝试
saveTapped
按键将数据写入境界(这是在工作) NextVC
视图控制器(这是工作的,有一个标识符的转折点 saveTappedSegue
直接从 FirstVC
)以此
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 中读取数据到显示。
你有几种方法可以做到这一点。你可以在prepareForSegue里面执行所有的逻辑,或者在saveTapped里面执行一些,在prepareForSegue里面执行一些。例如,第一种方法是这样的。
@objc func saveTapped(_ sender: UIBarButtonItem) {
self.performSegue(withIdentifier: "saveTappedSegue", sender: self)
}
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
}
}
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
}
}
另一种方法是通过对象来代替。
你可以从下一个VC中再次查询数据库,但鉴于你已经有了数据,那就太矫枉过正了。
使用 func prepare(for segue: UIStoryboardSegue, sender: Any?)
方法将当前viewcontroller的数据注入到下一个viewcontroller中。
如果你有一个快速的谷歌,有许多Swift依赖注入的教程。