2014-11-07 6 views
5

के साथ आज एक्सटेंशन (विजेट) के साथ कस्टम ऑब्जेक्ट्स की एक सरणी साझा करना यह मेरी पहली स्टैक पोस्ट है इसलिए कृपया मेरी पोस्टिंग तकनीक की समीक्षा करते समय रचनात्मक बनें!एनएसयूसर डीफॉल्ट

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

मुझे यह इंगित करना चाहिए कि मेरा विजेट ठीक तरह से स्थापित है, क्योंकि मैंने इसे ठीक से लिंक किया है और युक्त समूह को 'समूहों' में एक साथ जोड़ा है। मैं भी सफलतापूर्वक NSUserDefaults का इस्तेमाल किया है जब मैं विजेट के लिए ऑब्जेक्ट की श्रेणी पारित करने के लिए प्रयास करते हैं, विजेट के लिए NSStrings की एक सरणी पारित करने के लिए, तथापि, यह दुर्घटनाओं और मेरी लॉग पढ़ता है:

*** Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: '*** -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (Xitem)' 

मैं इस दुर्घटना समझते हैं कि ऑब्जेक्ट (Xitem) को संग्रहीत करने से संबंधित है, जो NSUserDefaults में कस्टम ऑब्जेक्ट्स को सहेजने के लिए एक आवश्यक कदम प्रतीत होता है। हालांकि, मैंने एप के उसी वर्ग के भीतर सरणी को सहेजने/लोड करने का परीक्षण किया है, और यह ठीक काम करता है! (नीचे कोड)

 NSData *encodedObject = [NSKeyedArchiver archivedDataWithRootObject:self.Xitems]; 
     NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.AaronTest"]; 
     [defaults setObject:encodedObject forKey:@"myArray"]; 
     [defaults synchronize]; 


     NSUserDefaults *defaults2 = [[NSUserDefaults alloc] initWithSuiteName:@"group.AaronTest"]; 
     NSData *encodedObject2 = [defaults2 objectForKey:@"myArray"]; 
     NSArray *array2 = [NSKeyedUnarchiver unarchiveObjectWithData:encodedObject2]; 

     for (Xitem *t in array2){ 

      NSLog(@"*****%@*****", t.itemName); 
     } 

ठीक है जैसा कि समझाया गया है, उपरोक्त कोड अपेक्षा के अनुसार काम करता है। हालांकि, जब मैं अपने कोड के दूसरे कोड में इस कोड का दूसरा 'अनारक्षित' आधा डालता हूं, तो मुझे उपर्युक्त त्रुटि मिलती है।

Xitem.h

#import <UIKit/UIKit.h> 
#import <Foundation/Foundation.h> 


@interface Xitem : NSObject <NSCoding> 
{ 
NSString *itemName; 
} 

-(void)encodeWithCoder:(NSCoder*)encoder; 
-(id)initWithCoder:(NSCoder*)decoder; 

@property NSString *itemName; 

@end 
: नीचे मेरी कोड को दिखाने के लिए मैं कैसे सांकेतिक शब्दों में बदलना/वस्तु को डिकोड (यह ध्यान देने योग्य है कि इस वस्तु मेरी डिबगिंग की सादगी के लिए बनाया गया था लायक हो सकता है और केवल एक NSString प्रॉपर्टी वाला) है

Xitem.m

#import "Xitem.h" 

@implementation Xitem 

@synthesize itemName; 

-(void)encodeWithCoder:(NSCoder*)encoder 
{ 

[encoder encodeObject:self.itemName forKey:@"iName"]; 

} 

-(id)initWithCoder:(NSCoder*)decoder 
{ 

self = [super init]; 

self.itemName = [decoder decodeObjectForKey:@"iName"]; 

return self; 
} 

@end 

मैं अपने विजेट और युक्त एप्लिकेशन कोड पोस्ट कर सकता है, लेकिन यह कोड के पहले सेट मैं (जैसे 'defaults2' का नाम दिया चर से अलग) पोस्ट से अलग नहीं है। मुझे यह इंगित करना चाहिए कि इस समस्या को हल करने की कोशिश करते समय मुझे वास्तव में संसाधन समाप्त हो गए हैं, लेकिन तथ्य यह है कि NSKeyedArchiver का उपयोग पूरी तरह से युक्त ऐप कार्यों में करते हुए, मुझे स्टंप कर दिया गया है।

मुझे एहसास है कि this post मेरी अपनी समस्या के समान है, लेकिन लेखक एक कामकाज का चयन करने का फैसला करता है, जबकि मैं वास्तव में जानना चाहता हूं कि यह क्यों काम नहीं करता है। मैं एक नया डेवलपर हूं और मैं सर्वोत्तम कामकाजी प्रथाओं पर पिकअप करने के लिए अपनी पूरी कोशिश कर रहा हूं ताकि किसी भी सलाह की सराहना की जा सके।

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

किसी का समय के लिए बहुत धन्यवाद :)

+0

क्या किसी के पास मेरे लिए कोई इनपुट है?मैंने इस समस्या को एक तरफ छोड़ दिया क्योंकि ऐसा लगता है कि इसे इस तरह से काम करना चाहिए, अगर कोई जानता है कि यह मुझे क्यों इंगित नहीं करता है। टक्कर के लिए खेद है लेकिन यह एक सप्ताह से अधिक हो गया है। – Swankzilla

उत्तर

3

ठीक है तो मैं बस यह तय की। किसी को भी एक ही समस्या है, इस पर जाएं: 'लक्ष्य'> 'विजेट'> 'बिल्ड चरण'> 'संकलन स्रोत'> कस्टम वर्ग जोड़ें (Xitem.m)

+0

भी एक ही समस्या है, लेकिन यह फिक्स मेरे लिए काम नहीं करना चाहिए ... – kurtanamo

+0

ध्यान रखें कि यह आपके ऐप बंडल में अनावश्यक डुप्लिकेशन जोड़ देगा; आप प्रभावी रूप से दो अलग-अलग ऑब्जेक्ट फ़ाइलों का निर्माण कर रहे हैं जो आपके ऐप और आपके ऐप एक्सटेंशन में इनलाइन लिंक करते हैं। छोटे ऐप्स के लिए बहुत बड़ा सौदा नहीं है, लेकिन इस पैटर्न को दोहराने से आपकी बाइनरी ज़रूरी हो सकती है। आखिरकार, मुझे लगता है कि एक बेहतर पैटर्न लंबे समय तक आपके फ्रेम (सामान्य-बीच-ऐप-एंड-ऐप-एक्सटेंशन) कोड को फ्रेमवर्क में निकालने जैसा कुछ करना होगा, फिर उस पर अपना ऐप ** और ** ऐप एक्सटेंशन दोनों लिंक करें फ्रेमवर्क। – fullofsquirrels

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