2009-04-07 9 views
5

के बारे में एक और सवाल आईफोन पर एप्लिकेशन स्थिति को बहाल करने के बारे में मेरा एक और सवाल है। सरल डेटा (चयनित टैब की तरह) NSUserDefaults में संग्रहीत किया जा सकता है, लेकिन यह पर्याप्त नहीं है।आईफोन एप्लिकेशन राज्य

मैं नेविगेशन नियंत्रकों समेत पूरे राज्य को पुनर्स्थापित करना चाहता हूं (उप-सब-सब व्यू कंट्रोलर पर जाएं)।

मेरी समस्या यह है कि मेरा आवेदन कई xib फ़ाइलों में विभाजित है, इसलिए शुरुआत में, सभी व्यू कंट्रोलर तत्काल नहीं हैं। क्या xib फ़ाइल से instanciation को "बल" करने का कोई तरीका है?

(मैं हाथ के नीचे कोई कोड है, लेकिन मैं एक छोटे से अंत लिखने के लिए करता है, तो यह स्पष्ट नहीं है की कोशिश कर सकते हैं)

धन्यवाद एक बहुत।

उत्तर

5

[viewController view] कॉलिंग सुनिश्चित करें कि किसी विशेष दृश्य के नियंत्रक के XIB लोड कर देगा, एक बार यह है, तो आप अपनी अन्य संपत्तियों के सामान्य रूप से के किसी भी उपयोग कर सकते हैं

यहाँ मैं क्या करने के लिए जाते है:

@class Record; // some model object--I assume it has an integer record ID 
@class DetailViewController; 

@interface RootViewController : UIViewController { 
    IBOutlet DetailViewController * detailController; 
} 

- (void)restore; 
... 
@end 

@implementation RootViewController 

// Note: all detailController showings--even ones from within 
// RootViewController--should go through this method. 
- (void)showRecord:(Record*)record animated:(BOOL)animated { 
    [self view]; // ensures detailController is loaded 

    [[NSUserDefaults standardUserDefaults] setInteger:record.recordID 
               forKey:@"record"]; 
    detailController.record = record; 

    [self.navigationController pushViewController:detailController 
             animated:animated]; 
} 

- (void)restore { 
    int recordID = [[NSUserDefaults standardUserDefaults] integerForKey:@"record"]; 

    if(recordID) { 
     Record * record = [Record recordWithID:recordID]; 
     [rootViewController showRecord:record animated:NO]; 
     // If DetailViewController has its own state to restore, add this here: 
     // [detailController restore]; 
    } 
} 
... 
- (void)viewDidAppear:(BOOL)animated { 
    [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"record"]; 
} 
@end 

@implementation MyAppDelegate 

- (void)applicationDidFinishLaunching:(UIApplication*)application { 
    ... 
    [rootViewController restore]; 
    ... 
} 
... 
@end 

दृश्य पदानुक्रम के प्रत्येक स्तर के अपने राज्य की बचत का ख्याल रखता है, तो अनुप्रयोग नियंत्रक के बारे में हर संभव विचारों और जो आदेश दिखाए जा सकते थे पता करने के लिए नहीं है

+0

ऐसा लगता है कि यह एकदम सही समाधान है, मैं जितनी जल्दी हो सके परीक्षण करूंगा। धन्यवाद ! –

+0

स्टार्टअप ब्रेक पर सभी नियंत्रकों की लोडिंग उन्हें आलसी लोड करने की अवधारणा, अनुप्रयोग स्टार्टअप समय और मेमोरी उपयोग में वृद्धि। – Kornel

+0

यह सभी नियंत्रकों को लोड नहीं करता है क्योंकि उप-नियंत्रक तब तक लोड नहीं होता है जब तक कि सुपरकंट्रोलर के पास रिकॉर्ड आईडी न हो। –

4

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

दृश्य नियंत्रकों की वास्तविक लोडिंग बहुत सरल है: मैं बस उन्हें तुरंत चालू करता हूं। मेरे प्रत्येक व्यू कंट्रोलर क्लास को ओवरराइड किया गया है- कॉल करने के लिए कॉल करें- WinNitNibName: बंडल: सुपर पर, तो कॉल कंट्रोलर इंस्टेंस बनाने के लिए कॉल ऑलोक और -इनिट उचित .xib फ़ाइल से लोड करने के लिए पर्याप्त है। फिर, जैसा कि ऊपर वर्णित है, मैं यह नेविगेशन नियंत्रक के ढेर में पुश:

[self.navigationController pushViewController: controller animated: YES]; 

आप इस रूप में कई परतों गहरी के रूप में आप की जरूरत है क्या कर सकते हैं करने के लिए, ज़ाहिर है, लेकिन ध्यान में भालू है कि आप को देखने पुश करने के लिए चाहते हो सकता है एनीमेशन के बिना नियंत्रक अगर कई संक्रमण होने जा रहे हैं; यह उल्टा उपयोगकर्ता कई एनिमेशन (के माध्यम से प्रतीक्षा करनी पड़ती के लिए होगा:।

0

सेब "ड्रिलडाउनसेव" नमूना कोड देखें। वही है जो आप चाहते हैं

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