2009-07-20 14 views
7

मुझे उपरोक्त त्रुटि मिल रही है जब निम्न आईफोन सिम्युलेटर (3.0 ओएस) में चलता है:उद्देश्य-सी त्रुटि: संपत्ति 'सक्रिय' कक्षा 'routine' पर एक स्केलर प्रकार है। इसके लिए गेटर विधि उत्पन्न नहीं कर सकता

@interface Routine : NSManagedObject { 

} 

@property (nonatomic) BOOL active; 

@implementation Routine 
@dynamic active 
@end 

जैसा कि आप देख सकते हैं, मैं एनएसएमएनेज ऑब्जेक्ट को उप-वर्गीकृत कर रहा हूं क्योंकि मैं कोर डेटा का उपयोग कर रहा हूं। मेरे डेटा मॉडल में, "सक्रिय" प्रकार बूलियन का एक विकल्प विशेषता है।

मैं यहाँ क्या गलत कर रहा हूँ?

धन्यवाद!

उत्तर

17

सीडी से बाहर आने वाली हर चीज एक वस्तु है, न कि स्केलर।

@interface Routine : NSManagedObject { 

} 

@property (nonatomic) NSNumber * active; 

@implementation Routine 
@dynamic active 
@end 

अगर आप चाहते हैं आप एक अदिश के रूप में इसके साथ सौदा करने के लिए एक सुविधा एक्सेसर जोड़ सकते हैं:: करने के लिए तो, अपने कोड परिवर्तक यदि आप,

- (BOOL) activeScalar { 
    return self.active.boolValue; 
} 

- (void) setActiveScalar:(BOOL)active_ { 
    self.active = [NSNumber numberWithBool:active_]; 
} 

अंत में एक संपत्ति पर कंट्रोल क्लिक करें मॉडल संपादक यह आपके पेस्ट बोर्ड में उचित घोषणाओं और परिभाषाओं की प्रतिलिपि बनाने के विकल्प सहित एक विशाल प्रासंगिक मेनू लाएगा, इसलिए आपको उन्हें स्वयं लिखना नहीं है।

+0

बहुत बढ़िया, यह काम किया। धन्यवाद! – higginbotham

+0

छोटी गलती: इसमें बदलें: - (शून्य) setActiveScalar: (BOOL) active_ { self.active = [NSNumber numberWithBool: active_]; } – benvolioT

2

इसके लायक होने के लिए, मैंने पाया कि दस्तावेज़ स्केलर्स के लिए थोड़ा अलग समाधान प्रदान करते हैं। आम तौर पर आप ऑब्जेक्ट्स के बजाए स्केलर्स का उपयोग करने से हतोत्साहित होते हैं, लेकिन यदि आप करते हैं तो http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/CoreData/Articles/cdNSAttributes.html बताता है कि यह कैसे करें। स्वचालित रूप से जेनरेट किए गए एक्सेसर्स तक पहुंचने के लिए आप "primitiveName" और "setPrimitiveName" का उपयोग करते हैं जो आपके स्केलर को किसी ऑब्जेक्ट में डालते हैं (उदा। NSNumber)। फिर एक स्केलर @ प्रॉपर्टी बनाएं और अपनी संपत्ति के लिए एक्सेसर्स लिखें जो प्राइमेटिव का उपयोग करें।

यह प्रतीत होता है कि हुड के तहत कोरडाटा आपके गुण को परिशिष्ट स्टोर में स्केलर के रूप में संग्रहीत कर रहा है और इसे एक ऑब्जेक्ट में परिवर्तित करने के लिए इसे एक आदिम के रूप में परिवर्तित कर रहा है। तो जब आप setName को कार्यान्वित करते हैं, जैसा कि मैंने दस्तावेज़ और नमूना कोड पढ़ा है, तो आपका मान किसी ऑब्जेक्ट में रखा गया है और फिर स्केलर को सेटप्रिमेटनाम स्वचालित कार्यान्वयन में फिर से निकाला जाता है। प्रत्येक प्राप्त या सेट के लिए अनावश्यक मार्शलिंग की तरह लगता है।

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