2012-04-15 13 views
11

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

मेरे पास केवल दो अलग-अलग दृश्य हैं जिन्हें सहेजने की आवश्यकता है (आप एक से दूसरे में आगे बढ़ते हैं)। मैं सटीक स्मृति लेने के बिना स्टोरीबोर्ड दृश्यों को सहेजने के बारे में कैसे जा सकता हूं?

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

Figure 1.1 चित्र 1.1

आंकड़ा 1.2 में आप देखते हैं कि क्या होता है जब आप एक के अंदर नल कई तालिका दृश्य कोशिकाओं के (एक छवि दृश्य दिखाई नहीं देता।)

Figure 1.2 चित्रा 1.2

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

संपादित करें: मैंने दोनों दृश्यों के लिए एक ही दृश्य नियंत्रक का उपयोग करने की कोशिश की, लेकिन इसने समस्या को हल नहीं किया।

अद्यतन: मुझे अभी निम्न कोड मिला है (जो मुझे लगता है कि एक विचार राज्य स्टोर करता है)। मैं इसका उपयोग कैसे कर सकता हूं और यही वह है जिसे मैं ढूंढ रहा हूं?

MyViewController *myViewController=[MyViewController alloc] initWithNibName:@"myView" bundle:nil]; 
[[self navigationController] pushViewController:myViewController animated:YES]; 
[myViewController release]; 
+2

ओएस को आपके लिए 'दृश्य' सहेजना चाहिए। आपके मामले के बारे में क्या विशेष रूप से अलग है? – CodaFi

+0

जब मैं घर बटन दबाता हूं और ऐप को फिर से खोलता हूं तो यह दृश्य के राज्य को बचाता है, लेकिन जब मैं एक अलग दृश्य और पीछे संक्रमण करता हूं तो यह दृश्य को सहेज नहीं पाएगा। –

उत्तर

2

मैं दो बातों का एक संयोजन सुझाव है: 1. लें DBD की सलाह और यह सुनिश्चित करें कि आप लगातार नए विचारों 2. एक साझा कक्षा डेटा नियंत्रक (है कि गोल्फरों के लिए बनाएं न बनाएं, ताकि डेटा दृश्य से स्वतंत्र हो)

सीगू बनाने का सही तरीका दाएं कोने में दाईं ओर दृश्य नियंत्रक से अग्रणी होगा। हालांकि, सही पर एक आप

-(IBAction)buttonPushed:(id)sender 
     [self dismissModalViewControllerAnimated:YES]; 
} 

उपयोग कर सकते हैं यह आप बाईं तरफ के दृश्य नियंत्रक वापस ले लेगा खारिज करने के लिए, उसकी मूल स्थिति में छोड़ दिया पर दृश्य नियंत्रक के साथ। समस्या यह है कि दाईं ओर डेटा को कैसे सहेजना है।

ऐसा करने के लिए, आप एक सिंगलटन वर्ग बना सकते हैं। सिंगलटन कक्षाओं में केवल एक उदाहरण होता है, इसलिए कोई फर्क नहीं पड़ता कि आप दाईं ओर व्यू कंट्रोलर पर कितनी बार जाते हैं, डेटा हमेशा वही होगा।

सिंगलटन वर्ग कार्यान्वयन (एक वर्ग कहा जाता DataManager का) - हैडर

@interface DataManager : NSObject { 
} 

+(id)initializeData; 
-(id)init; 
@end 

सिंगलटन वर्ग कार्यान्वयन (एक वर्ग कहा जाता DataManager का) - मुख्य

static DataManager *sharedDataManager = nil; 

@implementation DataManager 
+(id)initializeData { 
    @synchronized(self) { 
     if (sharedDataManager == nil) 
      sharedDataManager = [[self alloc] init]; 
    } 
    return sharedDataManager; 
} 

-(id)init { 
    if(self == [super init]) { 
    } 
    return self; 
} 
@end 

फिर, अपने दृश्य नियंत्रक कोड के अंदर आप इस उदाहरण को

DataManager *sharedDataManager = [DataManager initializeDataManager]; 

इस तरह से आपके पास हो सकता है वही डेटा इससे कोई फ़र्क नहीं पड़ता कि आप कितनी बार विचार स्विच करते हैं। इसके अलावा, आप डेटा और आपके व्यू कंट्रोलर को अलग रखकर एमवीसी प्रोग्रामिंग का बेहतर पालन कर सकते हैं। (http://en.wikipedia.org/wiki/Model–view–controller)

0

मुझे लगता है कि आपका क्या मतलब है। यह प्रत्येक एप्लिकेशन के साथ होना चाहिए, जैसे कि नेविगेशन स्टैक में अंतिम दृश्य नियंत्रक को स्थानांतरित कर दिया जाता है, इसे हटा दिया जाता है और मुक्त किया जाता है। यदि आपको टेक्स्ट या ऑब्जेक्ट पोजीशन जैसे मानों को सहेजने की ज़रूरत है, तो एक प्लिस्ट जाने का रास्ता हो सकता है। एक प्लेस्ट का उपयोग करने के लिए this related question देखें।

+0

वहाँ किसी भी तरह से मैं पुनःआवंटन नहीं कर सकते हैं/दृश्य –

+0

मैं UIViewController एकमात्र की कभी नहीं सुना है मुक्त है ... मैं इसे संभव होगा लगता है। – CodaFi

0

ऐप्पल आपके लिए ऐसा करने वाला नहीं है। आपको शायद NSUserDefaults का उपयोग करके प्रत्येक दृश्य की स्थिति को सहेजना चाहिए और प्रत्येक बार जब आपका एप्लिकेशन आपके सहेजे गए डेटा को फिर से लोड करता है।

यदि आप CoreData में सब कुछ संग्रहीत कर रहे हैं तो आपको केवल सक्रिय दृश्य और कुछ ऑब्जेक्ट आईडी सहेजने की आवश्यकता होगी, अगर आपको अपने पास कोई भी डेटा सहेजने की आवश्यकता नहीं है।

आईओएस लॉन्च के बीच मेमोरी में आपके पास कुछ भी सहेजने की अपेक्षा न करें। बस इसे NSUserDefaults में संग्रहीत करें और इसे हर बार लोड करें।

+0

मैं दृश्य की स्थिति कैसे संग्रहीत करूं? मैं किस वस्तु को स्टोर करूंगा? क्या आप मुझे नमूना कोड दिखा सकते हैं? - मैं आईओएस और उद्देश्य सी के लिए नया हूँ ... –

0

NSUserDefaults में दृश्य की स्थिति को स्टोर करें या एक प्लेस्ट फ़ाइल के अंदर स्टोर करें, फिर दृश्य को लोड करते समय बस इसे सेटिंग से लोड करें।छवियों इंटरनेट से लोड रहे हैं, तो आप भी तो यह थोड़ा चिकनी चलाता है उन्हें अपने आईफोन हार्ड ड्राइव पर स्थानीय रूप से बचाने के लिए चाहते हो सकता है।

+0

मैं दृश्य की स्थिति कैसे संग्रहीत करूं? मैं किस वस्तु को स्टोर करूंगा? क्या आप मुझे नमूना कोड दिखा सकते हैं? –

2

चित्र 1.1 एक मौलिक दोष जो मैं आपकी समस्या के आधार का मानना ​​है।

सेग्यूज़ (स्टोरीबोर्ड पर नियंत्रकों के बीच तीर) UIViewControllers के संस्करण बनाते हैं। आपके पास परिपत्र segues है। तो जब आप मूल स्क्रीन पर "बैक" जाते हैं तो सेग्यू वास्तव में आपको एक नया संस्करण बनाकर आगे ले जा रहा है।

यह स्मृति उपयोग के लिए एक बड़ी समस्या पैदा कर सकता है, लेकिन इसका मतलब यह भी है कि आप राज्य को बनाए नहीं रख सकते हैं क्योंकि प्रत्येक नव निर्मित आइटम एक खाली स्लेट है।

चूंकि आप UINavigationController और pushViewController:animated: का उपयोग कर रहे हैं, तो आपको इससे छुटकारा पाने के लिए अपने नियंत्रक को "पॉप" करना चाहिए।

अपने "दूसरे" दृश्य पर, + बटन से सेग्यू को हटाएं और ईवेंट पर IBAction बनाएं। IBAction कोड में "पॉप"

- (IBAction)plusButtonTapped { 
    [self.navigationController popViewControllerAnimated:YES]; 
} 
+0

असल में मैं यूनाविगेशन कंट्रोलर का उपयोग नहीं कर रहा हूं, मैं अपने दृश्यों पर इसे कैसे कार्यान्वित कर सकता हूं? –

+0

आपके कोड में आप '[[self navigationController] pushViewController का उपयोग करके उल्लेख करते हैं: myViewController एनिमेटेड: YES];' अपनी दूसरी स्किन प्रदर्शित करने के लिए जिसका अर्थ है कि आप 'UINavigationController' का उपयोग कर रहे हैं – DBD

0

जोड़ने मुझे नहीं लगता कि आप चक्र segues चाहिए, सिर्फ एक जोड़ता है ViewController 2 से ViewController 1 पर्याप्त होना चाहिए का उपयोग करें और है कि जिस तरह से आप यह सुनिश्चित कर लें कि कोई अतिरिक्त viewcontrollers बनाए जा रहे हैं (स्मृति समस्याएं शायद?)

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

सबसे अच्छा यह है कि कॉर्डटा इतना कुशल है कि जब ऐप को रिसाव किया जाता है या अग्रभूमि में डेटा को फिर से लोड किया जाता है तो इसमें कोई समय नहीं लगता है, और अब तक 5k से अधिक रिकॉर्ड लोड करने के लिए मूल डेटा का उपयोग किया जाता है और यह ठीक काम करता है और यह बिल्कुल धीमा नहीं है।

जब मैं घर वापस आ जाता हूं बीमार एक कोड प्रदान करता है जिसका उपयोग आप मेरे मतलब के बारे में जानने के लिए कर सकते हैं।

0

यहाँ मुख्य बिंदु करने के लिए:

  1. डेटा है कि आपके आवेदन की जरूरत के लिए भंडारण के कुछ प्रकार है। यह आपके एप्लिकेशन का डेटा मॉडल है।

  2. प्रत्येक व्यू नियंत्रक को मॉडल तक पहुंचें, या कम से कम उस मॉडल के हिस्से को दें जिसे इसे अपना काम करने की आवश्यकता है। व्यू कंट्रोलर मॉडल के डेटा को तब बना सकता है जब इसे बनाया गया हो, या जब दृश्य दिखाई देने वाला हो।

  3. प्रत्येक व्यू कंट्रोलर उचित समय पर मॉडल को अद्यतन करता है, जैसे कि जब दृश्य गायब होने वाला होता है, या यहां तक ​​कि जब भी उपयोगकर्ता परिवर्तन करता है।

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

आम तौर पर, ऐप प्रतिनिधि मॉडल सेट अप करता है और फिर इसे आवश्यक रूप से दृश्य नियंत्रकों के पास भेजता है।

कुछ और मदद कर सकता है कि आप नहीं हैं ताकि आपके व्यू कंट्रोलर को नेविगेशन स्टैक से हटाए जाने पर हटा दिया जा सके। यदि आप चाहें तो आप अपने ऐप प्रतिनिधि में दोनों व्यू कंट्रोलर सेट अप कर सकते हैं, ताकि वे चारों ओर चिपके रहें। फिर आप उन सभी का उपयोग कर सकते हैं जो आपको हर समय नए बनाने के बजाय मिलते हैं, और ऐसा करने में आपको स्वचालित रूप से कुछ हद तक दृढ़ता मिल जाएगी।

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