写入领域(成功),转至 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
的条形按钮函数。当点击它时,我有一些字符串数据被成功写入领域数据库。
我正在尝试
- 获取
saveTapped
按钮以 save/write 数据到领域(这是有效的)
- 一旦数据被写入领域,就可以连接到
NextVC
视图控制器(这是有效的,带有标识符 saveTappedSegue
的连接直接来自 FirstVC
)
到那时
- 显示
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
}
}
另一种方法是传入对象。
我在 FirstVC
上有一个名为 saveTapped
的条形按钮函数。当点击它时,我有一些字符串数据被成功写入领域数据库。
我正在尝试
- 获取
saveTapped
按钮以 save/write 数据到领域(这是有效的) - 一旦数据被写入领域,就可以连接到
NextVC
视图控制器(这是有效的,带有标识符saveTappedSegue
的连接直接来自FirstVC
)
到那时
- 显示
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
}
}
另一种方法是传入对象。