2013-04-03 4 views
17

मेरे पास एक स्टोरीबोर्ड में एक व्यू कंट्रोलर है जो एक कंटेनर व्यू का उपयोग कर रहा है। दोनों में बहाली पहचानकर्ता सेट हैं। माता-पिता को बचाया जा रहा है और ठीक से बहाल किया जा रहा है। हालांकि बच्चा नहीं है। न तो -encodeRestorableStateWithCoder: या -decodeRestorableStateWithCoder: को बाल दृश्य नियंत्रक पर बुलाया जा रहा है।आईओएस राज्य संरक्षण और कंटेनर विचार

दृश्य व्यूअर के साथ बनाए गए बाल दृश्य नियंत्रकों को सहेजने का सही तरीका क्या है? मैं माता-पिता -encodeRestorableStateWithCoder: में बाल दृश्य नियंत्रक को सहेज सकता हूं, जिससे इसे सहेजा जा सकता है, लेकिन मेरे पास पुनर्स्थापना के दौरान इसका उपयोग करने का कोई तरीका नहीं है।

+0

आप addChildViewController साथ माता-पिता के लिए बच्चे जोड़ा था:? – jsd

+0

आप didMoveToParentViewController फोन किया था? तुम्हारे जाने के बाद जनक दृश्य नियंत्रक के लिए बच्चे दृश्य नियंत्रक जोड़ा विधि – HermioneGreen

+0

कंटेनर दृश्य चाहिए स्वचालित रूप से ऐसा कर रहे हैं। मुझे माता-पिता बच्चे दृश्य नियंत्रकों से इसका संदर्भ मिल रहा है। –

उत्तर

-1

मुझे लगता है कि इस सवाल का जवाब documentation में है यह कहा जाता है:।

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

तो तुम ऐसा ही कुछ कर सकता है:

-(void)encodeRestorableStateWithCoder:(NSCoder *)coder { 
    [super encodeRestorableStateWithCoder:coder]; 
    [self.myChildViewController encodeRestorableStateWithCoder:coder]; 
} 

-(void)decodeRestorableStateWithCoder:(NSCoder *)coder { 
    [super decodeRestorableStateWithCoder:coder]; 
    [self.myChildViewController decodeRestorableStateWithCoder:coder]; 
} 

और MyChildViewController में स्वचालित रूप से किसी भी निहित बच्चे दृश्य नियंत्रकों के लिए संदर्भ बचाने नहीं करता है सुपर :)

+0

मेरा प्रश्न दृश्य कंटेनर का उपयोग करने के बारे में था, सामान्य रूप से बाल दृश्य नियंत्रक नहीं। –

+0

ठीक है मेरे मामले में मैं बाल दृश्य नियंत्रक जोड़ने के लिए कंटेनर दृश्य का उपयोग कर रहा हूं। सबसे पहले मुझे बनाया गया बच्चा व्यू कंट्रोलर - (शून्य) तैयार करने के लिए संदर्भ प्राप्त हो रहा हैफॉरसेग्यू: (UIStoryboardSegue *) segue प्रेषक: (आईडी) प्रेषक और फिर मैं मैन्युअल रूप से डीकोड और एन्कोड करता हूं जैसा कि मैंने पहले बताया था। –

+0

क्या MyChildViewController की स्थिति को डीकोड करने का कोई तरीका है, जो [सुपर डिकोडरस्टास्टेस्टस्टेटविथकोडर: कोडर] को स्वयं पर कॉल करता है - (शून्य) डीकोडरस्टास्टेस्टस्टेटविथकोडर: (एनएससीओडर *) कोडर? उदाहरण के लिए, मैं एक बच्चे दृश्य नियंत्रक के रूप में MyChildViewController का उपयोग करना चाहता हूं और साथ ही स्वतंत्र दृश्य नियंत्रक (pushViewController में पैरामीटर के रूप में उपयोग) के रूप में उपयोग करना चाहता हूं। – diimdeep

15

कंटेनर दृश्य नियंत्रक "न बुलाया जाए। आप एक कस्टम कंटेनर दृश्य नियंत्रक को लागू कर रहे हैं, तो आप सांकेतिक शब्दों में बदलना चाहिए बच्चे दृश्य नियंत्रक खुद वस्तुओं अगर आप चाहते हैं उन्हें संरक्षित किये जाने वाले "

वहाँ सरल नियमों कि मैंने पाया हैं:।

1.Embedded (बच्चे) देखें नियंत्रक को राज्य संरक्षण प्रक्रिया में पहले से ही बनाया जाना चाहिए और पैरेंट व्यू कंट्रोलर में जोड़ा जाना चाहिए। इसलिए, अगर आप स्टोरीबोर्ड का उपयोग करते हैं तो कुछ भी करने की ज़रूरत नहीं है अन्यथा आपको बाल दृश्य नियंत्रक को तुरंत चालू करना होगा और इसे मैन्युअल रूप से जोड़ना होगा:

-(void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    NSLog(@"Did load"); 
    MyChildViewController *childViewController = [MyChildViewController new]; 
    [self addChildViewController:childViewController]; 
    [childViewController didMoveToParentViewController:self]; 
    self.childVC = childViewController; 
} 

आप -viewDidLoad पर बच्चे के दृश्य को जोड़ सकते हैं o आर बाद में इसके लिए self.childVC.view.frame = [self frameForChildController]; [self.view addSubview:self.childVC.view]; का उपयोग करें।

माता पिता की -encodeRestorableStateWithCoder: खुद में बच्चे दृश्य नियंत्रक को बचाने के लिए कोई जरूरत नहीं 2.You, लेकिन आप -encodeObject:forKey: का उपयोग कर उस वस्तु के लिए एक संदर्भ सांकेतिक शब्दों में बदलना चाहिए। आप संदर्भ है, तो आप इस तरह यह कर सकते हैं:

-(void)encodeRestorableStateWithCoder:(NSCoder *)coder 
{ 
    NSLog(@"Encode"); 
    UIViewController *childViewController = self.childVC; 
    [coder encodeObject:childViewController forKey:@"ChildVC"]; 
    [super encodeRestorableStateWithCoder:coder]; 
} 

https://stackoverflow.com/a/13279703/2492707 यदि आप स्टोरीबोर्ड का उपयोग बच्चे कुलपति के संदर्भ में प्राप्त करने के लिए। या आप कुछ इस तरह सरल लिख सकते हैं:

-(void)encodeRestorableStateWithCoder:(NSCoder *)coder 
{ 
    NSLog(@"Encode"); 
    UIViewController *childViewController = [self.childViewControllers objectAtIndex:0]; //[self.childViewControllers lastObject]; 
    [coder encodeObject:childViewController forKey:@"ChildVC"]; 
    [super encodeRestorableStateWithCoder:coder]; 
} 

3. एंबेडेड (बच्चे) दृश्य नियंत्रक पहले से ही बनाया जाना चाहिए और राज्य बहाली की प्रक्रिया पर जनक दृश्य नियंत्रक को जोड़ा गया। इसलिए, यदि आपने पहले पैराग्राफ में सबकुछ किया है, तो यहां कुछ और करने के लिए कुछ भी नहीं है।

4. "इस मामले में, हालांकि, हम बाल दृश्य नियंत्रक को डीकोड नहीं करते हैं। हम कर सकते हैं, लेकिन वास्तव में हमें इसकी आवश्यकता नहीं है।MyChildViewController ऑब्जेक्ट अपनी स्थिति को पुनर्स्थापित करेगा। हम केवल आदेश क्रम MyChildViewController उदाहरण के लिए नीचे श्रृंखला चलने के लिए प्राप्त करने के लिए इस संदर्भ इनकोडिंग और बचाने और पुनर्स्थापित करूँ उस पर "।

-(void)decodeRestorableStateWithCoder:(NSCoder *)coder 
{ 
    NSLog(@"Decode"); 
    [super decodeRestorableStateWithCoder:coder]; 
} 

This पुस्तक कंटेनर विचारों के साथ राज्य के संरक्षण को समझने के लिए मुझे मदद मिलती है। इसके अलावा look इस पुस्तक के लिए एक अच्छा उदाहरण के लिए

+1

इसे सारांशित करना, यदि आप स्टोरीबोर्ड कंटेनर व्यू (एम्बेड सिग्ने वाला एक) का उपयोग करते हैं, तो आपको केवल 'एनकोड ऑब्जेक्ट: forKey:' को कॉल करने के लिए माता-पिता के 'एन्कोडरस्टेस्टस्टेटविथकोडर:' से बच्चे के साथ कॉल करना होगा। बच्चे के संदर्भ को प्राप्त करने का सबसे अच्छा तरीका एम्बेड तैयार करने के लिए 'readyForSegue: प्रेषक:' में है। बच्चे को मैन्युअल रूप से डीकोड करने की आवश्यकता नहीं है, क्योंकि बहाली की प्रक्रिया पहले से ही मौजूदा बच्चे को मिल जाएगी और संग्रह से अपने राज्य को बहाल करेगी। हालांकि, अगर आप स्टोरीबोर्ड का उपयोग नहीं करते हैं (यानी बच्चों को मैन्युअल रूप से जोड़ें) तो आपको उस तंत्र को भी लागू करने की आवश्यकता हो सकती है। –

+0

आप कहते हैं कि एम्बेडेड बाल नियंत्रक पहले से ही बनाया जाना चाहिए और राज्य बहाली प्रक्रिया में मूल दृश्य में जोड़ा जाना चाहिए। लेकिन हम इसे कैसे एक्सेस कर सकते हैं? क्योंकि अगर यह पहले से ही तत्काल है, तो किसी को इसे फिर से नहीं देखना चाहिए जैसा आपने दिखाया था – markusian

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