2015-09-09 15 views
8

लक्ष्य: मैं एक टैब नियंत्रक-आधारित ऐप (प्रत्येक टैब पर नेविगेशन नियंत्रकों के साथ) पर राज्य को पुनर्स्थापित करने का प्रयास कर रहा हूं।टैब बार और नेविगेशन कंट्रोलर ऐप में राज्य बहाली

समस्या: पुन: लॉन्च होने पर, चयनित टैब अपेक्षित के रूप में पुनर्स्थापित किया जाता है, लेकिन कहा गया टैब के अंदर नेविगेशन पदानुक्रम नहीं है।

विकास:

  1. मैं पहली परियोजना टेम्पलेट "टैब आधारित एप्लिकेशन" के साथ शुरू कर दिया।
  2. अगला, मैंने बाल दृश्य नियंत्रकों और टैब बार नियंत्रक दोनों को बहाली आईडी जोड़ दी।
  3. ऐप प्रतिनिधि में, मैंने application(_:shouldSaveApplicationState:) और application(_:shouldRestoreApplicationState:) लागू किया।

मैं तब ऐप चलाता हूं, दूसरे (दाएं) टैब पर स्विच करता हूं, घर दबाता हूं, समाप्त कर देता हूं। ओ रिलांच, दायां टैब प्रदर्शित होता है (अपेक्षित के रूप में)। अभी तक इतना अच्छा है।

  1. अगला, मैं स्टोरीबोर्ड पर जाता हूं और संबंधित नेविगेशन नियंत्रकों में बाल दृश्य नियंत्रकों को एम्बेड करता हूं, और उन लोगों को बहाली आईडी भी निर्दिष्ट करता हूं।

मैं ऐप चलाता हूं, और बहाली अभी भी काम करता है। अभी भी अच्छा है।

  1. अगला, मैं एक "विस्तार" दृश्य नियंत्रक जोड़ता हूं; इसकी कक्षा स्टोरीबोर्ड पर UIViewController का एक कस्टम उप-वर्ग है, जिसमें डीबग लेबल और उसके दृश्य के पृष्ठभूमि रंग की सामग्री को कॉन्फ़िगर करने के गुण हैं।

  2. मैंने प्रत्येक टैब के शीर्ष दृश्य नियंत्रकों पर "विवरण दिखाएं ..." बटन रखा है, और प्रत्येक से साझा (साझा) विवरण दृश्य नियंत्रक में एक सेगू बना दिया है। तो अब मेरा स्टोरीबोर्ड हेक्सागोन की तरह दिखता है (साथ ही, दोनों सीगों में इंटरफ़ेस बिल्डर में सेट पहचानकर्ता हैं)। इसलिए, बाएं और दाएं शीर्ष दृश्य नियंत्रक दोनों एक ही प्रकार के "विस्तार" दृश्य नियंत्रक साझा करते हैं। शो पर, यह कॉन्फ़िगर किया गया है ताकि इसे कहां से धक्का दिया जा सके (अगले बिंदु देखें)।

  3. शीर्ष दृश्य नियंत्रकों में से प्रत्येक पर prepareForSegue(_:sender:) विधि, मैं धक्का विस्तार दृश्य नियंत्रक को अलग-अलग कॉन्फ़िगर करता हूं: अलग-अलग पाठ और पृष्ठभूमि रंग ("बाएं" और नीला, और "दाएं" और लाल, क्रमशः)।

  4. मैंने टेक्स्ट और पृष्ठभूमि रंग गुणों की स्थिति को सहेजने और पुनर्स्थापित करने के लिए विस्तार दृश्य नियंत्रक को कोड जोड़ा: encodeRestorableStateWithCoder(_:) और decodeRestorableStateWithCoder(_:)। इसके अलावा, मैंने viewDidLoad() लागू किया ताकि दृश्य में उन गुणों के मूल्यों को प्रतिबिंबित किया जा सके। जब भी इसे तुरंत चालू किया जाता है और नेगू के माध्यम से नेविगेशन में धक्का दिया जाता है, तो गुण पहले सेट होते हैं और फिर viewDidLoad() में दृश्य को कॉन्फ़िगर करने के लिए उपयोग किए जाते हैं। जब भी इसे बहाली के दौरान तत्काल किया जाता है, तो गुण decodeRestorableStateWithCoder(_:) में सेट होते हैं और इसी प्रकार viewDidLoad() में उपयोग किए जाते हैं।

... लेकिन जब मैं इस कोड को चलाने के लिए, पिछले चयनित टैब पुनर्स्थापित किया जाता है, लेकिन केवल शीर्ष दृश्य नियंत्रक वामपंथियों या दाएं, नहीं विस्तार पर निर्भर है।दिलचस्प बात यह है कि पृष्ठभूमि रंग आखिरी बार एक दृश्य के लिए विस्तार दृश्य नियंत्रक चमक पर सेट है।

मैं encodeRestorableStateWithCoder(_:) और decodeRestorableStateWithCoder(_:) में ब्रेक अंक रखा गया है, लेकिन उनमें से पहले मार डाला जाता है (एनकोड)।

  1. आश्चर्य हो रहा है कि क्या हो सकता है, मैं आगे बढ़ गया और ऐप प्रतिनिधि के application(_:viewControllerWithRestorationIdentifierPath:coder:) (हमेशा शून्य वापस लौट रहा था, लेकिन पथ घटकों को लॉगिंग) लागू किया।

प्रलेखन इस विधि की आवश्यकता है या नहीं, इस पर दस्तावेज बहुत स्पष्ट नहीं है, और किसी भी मामले में सभी को छोड़कर नियंत्रकों को विस्तार से पूरी तरह से बहाल किया जा रहा है। मैंने अंतिम पथ घटक (यानी, नियंत्रक की बहाली आईडी) के आधार पर प्रत्येक दृश्य नियंत्रक को तत्काल करने के लिए कोड जोड़ा और इसे वापस कर दिया।

अब, decodeRestorableStateWithCoder(_:) कहा जाता है, लेकिन नेविगेशन अभी भी एक दूसरे के बाद टैब के शीर्ष दृश्य नियंत्रक पर वापस जाता है।

तो, क्या चल रहा है? टैब बार + नेविगेशन कंट्रोलर ऐप में राज्य संरक्षण और बहाली को लागू करने के लिए मुझे क्या याद आ रही है?

उत्तर

6

निश्चित: तो, मेरे कोड के साथ कई समस्याएं थीं ...

  1. ऐसा लगता है कि मेरे मामले में, मैं application(_:viewControllerWithRestorationIdentifierPath:coder:) लागू करने की आवश्यकता नहीं है।

  2. encodeRestorableStateWithCoder(_:) और decodeRestorableStateWithCoder(_:) मेरे कार्यान्वयन (comments of this answer देखें) बुला नहीं थे super (जैसा कि ऊपर सवाल का accepted answer में सुझाव दिया)।

  3. आखिरकार, मुझे सही दृश्य नियंत्रक (विस्तार) दिखाई देने के लिए मिला, लेकिन इसके सबव्यूज 'स्टेट (टेक्स्ट लेबल सामग्री और मुख्य दृश्य पृष्ठभूमि रंग) प्रारंभिक, खाली स्थिति में थे (अपने अंतिम राज्य में बहाल नहीं किया जा रहा था - यानी, पाठ लेबल सामग्री और बीजी रंग)। के रूप में this question में उल्लेख किया है, viewDidLoad() नहीं सही decodeRestorableStateWithCoder(_:) के बाद कहा जाता है (जैसे मैं मान लिया है) है, इसलिए बजाय मैं यूआई अद्यतन करने के लिए दोनों viewDidLoad() और decodeRestorableStateWithCoder(_:) से एक आम तरीका कहते हैं।

सामान्य रूप से, मैं अपने कोड (मेरी माफी ...) में पर्याप्त संशोधन खोजने या कोशिश करने से पहले एक प्रश्न पोस्ट करने के लिए पहुंचे।

मुझे उम्मीद है कि यह कम से कम किसी और की मदद करेगा।

सामान्य रूप से, अगर कोई अतिरिक्त प्रकाश डालता है, तो मैं अपने उत्तर को स्वीकार करने से पहले कुछ दिन इंतजार करूंगा।

संबंधित मुद्दे