ठीक है तो इसलिए कि आप ने कहा आप अनुप्रयोग शुरू होता है पर डेटा बनाए रखना चाहते आपको अपने आइटम स्टोर करने के लिए उपयोगकर्ता डिफ़ॉल्ट की आवश्यकता होगी। जैसा कि दान ने पहले से ही सुझाव दिया है कि आप मूल रूप से इसे सही कर रहे हैं। आप बस एक वैरिएबल सेट करना चाहते हैं जिसे पहले घोषित नहीं किया गया था। लेकिन मैं आपको निम्नलिखित कोड में दिखाऊंगा। मैं एक दूसरा दृष्टिकोण भी संलग्न करूंगा जिसमें सेग्यू प्रदर्शन करते समय आइटम अगले दृश्य नियंत्रक को पास कर दिए जाएंगे।
पहला उदाहरण: कल्पना कीजिए कि आपके पास आपके उदाहरण में दो दृश्य नियंत्रक हैं। उपयोगकर्ता दृश्य इनपुट करने के लिए पहले दृश्य नियंत्रक में UITextField शामिल है। जब भी हम स्टोरीबोर्ड सेग्यू (उदाहरण के लिए बटन दबाते समय) के साथ दूसरे व्यू कंट्रोलर पर पहले व्यू कंट्रोलर से स्विच करते हैं, तो हम मौजूदा ग्रंथों को पिछले डिफ़ॉल्ट से उपयोगकर्ता डिफ़ॉल्ट से लेते हैं और वर्तमान उपयोगकर्ता इनपुट जोड़ते हैं और फिर इसे वापस रखते हैं उपयोगकर्ता डिफ़ॉल्ट पर। यह पहली बार देखने नियंत्रक में क्या होता है:
class ViewController: UIViewController {
@IBOutlet weak var textField: UITextField!
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
super.prepare(for: segue, sender: sender)
if segue.identifier == "toSecondViewController" {
let itemsFromDefaults = UserDefaults.standard.object(forKey: "items")
var items: [String]
if let tempItems = itemsFromDefaults as? [String]
{
items = tempItems
items.append(textField.text!)
}
else
{
items = [textField.text!]
}
print(items)
UserDefaults.standard.set(items, forKey: "items")
}
}
}
यह पहली बार देखने नियंत्रक सुंदर अपने कोड के समान लगता है, लेकिन मैं पूर्णता के लिए इसे जोड़ने के लिए चाहता था।
फिर दूसरे दृश्य नियंत्रक में हम केवल उपयोगकर्ता डिफ़ॉल्ट से आइटम लेते हैं और इसे सीधे इस दृश्य नियंत्रक के आवृत्ति चर में संग्रहीत करते हैं। इसकी मदद से हम व्यू कंट्रोलर के भीतर अन्य तरीकों में जो चाहते हैं वह कर सकते हैं और वस्तुओं को आगे संसाधित कर सकते हैं। जैसा कि मैंने कहा कि तुम क्या अनदेखा कर रहे थे में आइटम संग्रहीत करने के लिए उदाहरण चर घोषणा था
class ViewController2: UIViewController {
private var items: [String]? // This is only accessible privately
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
self.items = UserDefaults.standard.object(forKey: "items") as? [String]
}
}
दूसरा उदाहरण:। तुम भी ViewController2 में एक आंतरिक/सार्वजनिक चर घोषित कर सकता है, ताकि आप पहली बार देखने से यह सीधे सेट कर सकते हैं प्रदर्शन segue में नियंत्रक। ViewController2 में उपयोगकर्ता डिफ़ॉल्ट से आइटम को पकड़ने की आवश्यकता नहीं होगी। इसके लिए आप segue के गंतव्य दृश्य नियंत्रक तक पहुंच सकते हैं, फिर इसे ViewController2 पर डालें और सीधे इसके आइटम सेट करें।
class ViewController: UIViewController {
@IBOutlet weak var textField: UITextField!
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
super.prepare(for: segue, sender: sender)
if segue.identifier == "toSecondViewController" {
let itemsFromDefaults = UserDefaults.standard.object(forKey: "items")
var items: [String]
// [...] Do the stuff to get the items and add current input like before [...]
let destinationViewController = segue.destination as! ViewController2
destinationViewController.items = items
}
}
}
class ViewController2: UIViewController {
var items: [String]? // This is accessible from outside now
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
print(items) // We can now print this because it is set in prepareForSegue
}
}
मुझे उम्मीद है कि मैं इसके साथ आपकी मदद कर सकता हूं और समझा सकता हूं। यदि आपके कोई प्रश्न हैं तो एक टिप्पणी छोड़ने के लिए स्वतंत्र महसूस करें।
आपकी समस्या वास्तव में क्या है? (इसके अलावा आप ViewDidAppear में एक बंद ब्रैकेट चूक गए) –
क्षमा करें, मैं बहुत स्पष्ट चाहता हूं।स्पष्ट रूप से मैं "अनसुलझा पहचानकर्ता वस्तुओं का उपयोग" है। –
मुझे लगता है कि जब आप इसके साथ सामान करते हैं तो आपको केवल userdefaults.standard को तुरंत चालू करने की आवश्यकता होती है। जैसे UserDefaults.standard()। सेट (आदि –