2012-04-18 7 views
9

मैं अपने आवेदन में एक जगह है जहाँ अनिवार्य रूप से हर ViewController एक स्थानीय NSManagedObjectContext है पर हूँ:आईओएस ओब्जे-सी। सही समाधान दे रहा है?

@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext; 

और हर segue ही सेटर

[segue.destinationViewController setManagedObjectContext:self.managedObjectContext]; 

जावा से आ रहा है के माध्यम से managedObjectContext गुजरता है, यह हो सकता है प्रत्येक व्यू कंट्रोलर लागू करने वाले एक अमूर्त वर्ग को बनाना आसान है। उद्देश्य-सी में ऐसा लगता है कि यह संभव नहीं है। जो मैं करना चाहता हूं वह एक बेस क्लास है जो इस उत्तीर्ण को निष्पादित करता है, लेकिन मूल रूप से कुछ भी जो UIViewController को लागू करता है, इसमें यह होगा (केवल एक सादा UIViewController के साथ-साथ UITableViewController)। क्या यह एक "अमूर्त" वर्ग बनाने के लिए संभव/सही होगा जो UIViewController के रूप में बनता है जो ऐसा करता है?

अद्यतन:

UIViewController + ManagedObjectContext.h

@interface UIViewController (ManagedObjectContext) 
@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext; 
@end 

UIViewController + ManagedObjectContext.m

#import "UIViewController+ManagedObjectContext.h" 
@implementation UIViewController (ManagedObjectContext){ 
    NSManagedObjectContext *context; // This is not valid, cant have local variables 
} 
@synthesize managedObjectContext; // This is not valid, must be @dynamic 
-(void)setManagedObjectContext:(NSManagedObjectContext *)context{ 
    //How do you have a local NSManagedObjectContext? 
} 
@end 
+4

: वैकल्पिक रूप से आप आवेदन प्रतिनिधि से प्रबंधित वस्तु संदर्भ प्राप्त कर सकते हैं आप

NSManagedObjectContext *moc=[thing managedObjectContext]; 

फोन करके managedObjectContext प्राप्त कर सकते हैं, तो आप प्रबंधित वस्तु बात कहा जाता है कहो मुझे लगता है कि आप एक उद्देश्य-सी श्रेणी की तलाश कर रहे हैं। वे कक्षाओं का विस्तार करने के लिए उपयोग किया जाता है। – Kyle

+2

उद्देश्य-सी 1.0 में प्रस्तुत कक्षा एक *** गड़बड़ *** थी, इसलिए इसे 2.0 में हटा दिया गया है। मुझे नहीं लगता कि यह कभी भी आईओएस एनएसओब्जेक्ट क्लास का हिस्सा था। – CodaFi

+0

जबकि मैंने आईओएस में कक्षा को कभी नहीं देखा है, मैंने नेविगेशन नियंत्रकों में UINavigationBar को प्रतिस्थापित करने के समान कुछ देखा है। – Kyle

उत्तर

5

तुम बस UIViewController की अपनी खुद की उपवर्ग कर सकते हैं, के MOCViewController कहते हैं, के साथ जाने managedObjectContext संपत्ति। फिर UIViewController को सीधे उपclassing के बजाय अपने सभी अन्य व्यू कंट्रोलर MOCViewController के उप-वर्ग बनें।

यदि आप वास्तव में इसे किसी श्रेणी के साथ करना चाहते हैं, तो आपकी श्रेणी दृश्य नियंत्रक को प्रबंधित ऑब्जेक्ट संदर्भ संलग्न करने के लिए objc_setAssociatedObject का उपयोग कर सकती है।

यदि आपके पास केवल एक प्रबंधित ऑब्जेक्ट संदर्भ है और आप इसे हर जगह चारों ओर पास कर रहे हैं, तो बस संदर्भ को अपने आवेदन प्रतिनिधि की संपत्ति में या वैश्विक चर में डालने पर विचार करें।

+0

यह मेरा पहला था, लेकिन फिर आपको प्रत्येक प्रकार के लिए एक की आवश्यकता होगी, UIViewController, UIListViewController, आदि – wuntee

+0

मैंने अपना जवाब अपडेट कर दिया है। –

5

आप इसे प्रबंधित ऑब्जेक्ट से प्रबंधित ऑब्जेक्ट कॉन्टेक्स्ट को अलग से पास करने के बजाय प्राप्त कर सकते हैं। सामान्य रूप से प्रबंधित ऑब्जेक्ट को पास करने के लिए यह अधिक तार्किक है।

उदाहरण के लिए:

AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
NSManagedObjectContext *moc = delegate.managedObjectContext; 
+0

यह सबसे अच्छा समाधान हो सकता है। मैं उस मामले में दौड़ रहा था जहां एक व्यू कंट्रोलर के पास प्रबंधित ऑब्जेक्ट नहीं था, लेकिन नेविगेशन में 3 चरणों की तरह था। मुझे एहसास नहीं हुआ कि आप ऐपडिलेगेट से संदर्भ प्राप्त कर सकते हैं। हालांकि इस मामले में भी, प्रत्येक कक्षा के भार में लिखना अच्छा लगेगा ... – wuntee

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