2016-10-23 6 views
6

के लिए तैयार करें मैं स्थायी डेटा का उपयोग करने और एक साथ Segue के लिए तैयार करने की कोशिश कर रहा हूं। (देखें नियंत्रक 1)स्थायी डेटा और सेग्यू

override func viewDidAppear(_ animated: Bool) { 

    let itemsObject = UserDefaults.standard.object(forKey: "items") 


    if let tempItems = itemsObject as? [String] { 

     items = tempItems 

} 
में

(नियंत्रक देखें 2):

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "toSecondViewController" { 

     let itemsObject = UserDefaults.standard.object(forKey: "items") 

     var items:[String] 

     if let tempItems = itemsObject as? [String] { 

      items = tempItems 

      items.append(textField.text!) 

      print(items) 

     } else { 

      items = [textField.text!] 

     } 

     UserDefaults.standard.set(items, forKey: "items") 


    } 
} 

मैं VC2 पर एक सरणी के लिए एक आइटम जोड़ने का प्रयास कर रहा हूँ यह है कि मैं क्या में अब तक है। फिर मैं सरणी को वीसी 1 में स्थानांतरित करना चाहता हूं जबकि इसे स्थायी रूप से संग्रहीत करना भी चाहता हूं। फिर हर बार जब मैं ऐप बंद करता हूं और पुनः लोड करता हूं तो मैं सरणी प्रिंट कर सकता हूं। त्रुटि संदेश "अनसुलझा पहचानकर्ता वस्तुओं का उपयोग" कहता है। मैं एक्सकोड 8.0 और स्विफ्ट 3.0 का उपयोग कर रहा हूं।

enter image description here

enter image description here

+0

आपकी समस्या वास्तव में क्या है? (इसके अलावा आप ViewDidAppear में एक बंद ब्रैकेट चूक गए) –

+0

क्षमा करें, मैं बहुत स्पष्ट चाहता हूं।स्पष्ट रूप से मैं "अनसुलझा पहचानकर्ता वस्तुओं का उपयोग" है। –

+0

मुझे लगता है कि जब आप इसके साथ सामान करते हैं तो आपको केवल userdefaults.standard को तुरंत चालू करने की आवश्यकता होती है। जैसे UserDefaults.standard()। सेट (आदि –

उत्तर

1

ठीक है तो इसलिए कि आप ने कहा आप अनुप्रयोग शुरू होता है पर डेटा बनाए रखना चाहते आपको अपने आइटम स्टोर करने के लिए उपयोगकर्ता डिफ़ॉल्ट की आवश्यकता होगी। जैसा कि दान ने पहले से ही सुझाव दिया है कि आप मूल रूप से इसे सही कर रहे हैं। आप बस एक वैरिएबल सेट करना चाहते हैं जिसे पहले घोषित नहीं किया गया था। लेकिन मैं आपको निम्नलिखित कोड में दिखाऊंगा। मैं एक दूसरा दृष्टिकोण भी संलग्न करूंगा जिसमें सेग्यू प्रदर्शन करते समय आइटम अगले दृश्य नियंत्रक को पास कर दिए जाएंगे।

पहला उदाहरण: कल्पना कीजिए कि आपके पास आपके उदाहरण में दो दृश्य नियंत्रक हैं। उपयोगकर्ता दृश्य इनपुट करने के लिए पहले दृश्य नियंत्रक में 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 
} 

} 

मुझे उम्मीद है कि मैं इसके साथ आपकी मदद कर सकता हूं और समझा सकता हूं। यदि आपके कोई प्रश्न हैं तो एक टिप्पणी छोड़ने के लिए स्वतंत्र महसूस करें।

1

आप लिखना "चलो" या "वर" viewDidAppear में भूल जाते हैं। इस प्रयास करें:

override func viewDidAppear(_ animated: Bool) { 

    let itemsObject = UserDefaults.standard.object(forKey: "items") 


    if let tempItems = itemsObject as? [String] { 

     let items = tempItems 

    } 
} 

आप के बाद अगर बयान है, तो आप चर से पहले घोषित करना चाहिए आइटम उपयोग करना चाहते हैं अगर बयान:

override func viewDidAppear(_ animated: Bool) { 

    let itemsObject = UserDefaults.standard.object(forKey: "items") 

    var items: [String] 
    if let tempItems = itemsObject as? [String] { 

     items = tempItems 
    } 
} 
संबंधित मुद्दे