6

का उपयोग स्टोरीबोर्ड आप (AppDelegate में पहली बार देखने नियंत्रक करने के लिए कोई आसान पहुँच है, हालांकि एक बार आप करते हैं prepareForSegue यह आसान नेविगेशन ढेर नीचे ManagedObjectContext पारित करने के लिए बनाता है पासिंग।ManagedObjectContext एक रूट UITabBarController साथ स्टोरीबोर्ड का उपयोग कर नियंत्रकों देखने पर

@synthesize moc = _moc; 
@property (nonatomic) __weak NSManagedObjectContext *moc; 

मैं इसके बारे में असहज कर रहा हूँ क्योंकि यह करने के लिए एक बहुत ही सुंदर तरीका प्रतीत नहीं होता: मैं प्रत्येक दृश्य नियंत्रक दे रही है (या उन नियंत्रक के सुपर क्लास) कोर डाटा एक MOC सदस्य का उपयोग की आवश्यकता होती है पर बसे गया है यह - बहुत अधिक कोड। लेकिन सीधे असाइन करने के लिए पूर्ण इंडे निर्दिष्ट करना आवश्यक है viewControllers विन्यास में, XES और AppDelegate हर बार बदलते आवश्यकता ManagedObjectContexts बदलने के लिए

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController; 

    // rootView gets a tab bar controller 
    for(UINavigationController *navController in tabBarController.viewControllers) { 

     for(UIViewController *viewController in navController.viewControllers) { 

      if([viewController respondsToSelector:@selector(setMoc:)]) { 
       [viewController performSelector:@selector(setMoc:) withObject:self.managedObjectContext]; 
       NSLog(@"Passed moc to %@", [viewController description]); 
      } 
     } 
    } 

    return YES; 
} 

क्या इस दृष्टिकोण का नुकसान कर रहे हैं और वहाँ एक बेहतर तरीका है? अगर मैं ठीक से समझ में आ

- (void)assignManagedObjectContextIfResponds:(UIViewController *)viewController { 

    if([viewController respondsToSelector:@selector(setMoc:)]) { 
     [viewController performSelector:@selector(setMoc:) withObject:self.managedObjectContext]; 
     NSLog(@"Passed moc to %@", [viewController description]); 
    } 

} 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    NSMutableArray *viewControllers = [NSMutableArray array]; 

    UIViewController *firstLevelViewController = self.window.rootViewController; 

    if([firstLevelViewController respondsToSelector:@selector(viewControllers)]) { 

     NSArray *firstLevelViewControllers = [firstLevelViewController performSelector:@selector(viewControllers)]; 

     for(UIViewController *secondLevelViewController in firstLevelViewControllers) { 

      if([secondLevelViewController respondsToSelector:@selector(viewControllers)]) { 

       NSArray *secondLevelViewControllers = [secondLevelViewController performSelector:@selector(viewControllers)]; 

       for(UIViewController *thirdLevelViewController in secondLevelViewControllers) { 

        [viewControllers addObject:thirdLevelViewController]; 
       } 

      } else { 
       [viewControllers addObject:secondLevelViewController]; 
      } 
     } 
    } else { 
     // this is the simple case, just one view controller as root 
     [viewControllers addObject:firstLevelViewController]; 
    } 

    // iterate over all the collected top-level view controllers and assign moc to them if they respond 
    for(UIViewController *viewController in viewControllers) { 
     [self assignManagedObjectContextIfResponds:viewController]; 
    } 

    return YES; 
} 

उत्तर

2

एडम,

जबकि मैं तलाश रहा है स्टोरीबोर्ड मैं काफी यह उसी तरह तुमने किया था सिवाय मुझे लगता है कि एक एमओसी संपत्ति थी मेरे विचार नियंत्रक से प्रत्येक एक प्रोटोकॉल के अनुरूप बनाया था।

वहां कुछ भी महत्वपूर्ण नहीं है, इसलिए मैं आगे बढ़ूंगा।

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

दुर्भाग्यवश, क्योंकि यह आधे बेक्ड समाधान है क्योंकि मैं अब पारंपरिक दृष्टिकोण के साथ चिपक रहा हूं, इसलिए मेरे सभी व्यू कंट्रोलर आवंटित किए गए हैं और मैन्युअल रूप से init'd और अधिक महत्वपूर्ण रूप से मैंने प्रत्येक व्यू कंट्रोलर को एक विधि जोड़ा है initWithMOC करने के लिए: (एमओसी *) moc;

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

कोई और बेहतर तरीके से आया है?

सीए।

4

पता नहीं है, लेकिन आप AppDelegate कक्षा में सीधे प्रबंधित वस्तु संदर्भ छोड़ क्यों नहीं करते हैं और इन्स्तांत के लिए सभी तर्क छोड़: यह बेहतर प्रयास करने के लिए और अधिक सामान्य हो रहा है। और तब से आप इसके लिए पूछ सकते हैं।

@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext; 

तो आप इसे किसी भी समय कहीं भी याद कर सकते हैं।

#define MOC [(YourApplicationDelegate*)[[UIApplication sharedApplication] delegate] managedObjectContext] 

इसलिए इस बन:

[MOC save:&error]; 

आप इस हर जगह आप की तरह ले जा सकते हैं

NSManagedObjectContext *moc = [(YourApplicationDelegate*)[[UIApplication sharedApplication] delegate] managedObjectContext]; 

सुविधा के लिए मैं एक इसके लिए परिभाषित की घोषणा की। एक्सकोड में कोरडाटा एप्लिकेशन के लिए ऑटो जेनरेट कोड पर नज़र डालने का प्रयास करें, आप देखेंगे कि कोरडाटा के साथ कई एक्सेसर्स वहां हैं, और CoreData स्वयं पहले अनुरोध पर आलसी रूप से प्रारंभ किया गया है।

+1

मुझे पता है कि आप ऐसा कर सकते हैं लेकिन मैं इससे बचने की कोशिश कर रहा हूं। स्पष्ट रूप से स्पष्ट नहीं कर सकता कि यह गलत क्यों है लेकिन ऐसा लगता है कि, # हर जगह AppDelegate आयात करना। –

+1

यह गलत नहीं है, यह करने का तरीका है, जब आप इसे आसानी से एक्सेस कर सकते हैं तो संदर्भ पारित करने में कोई बात नहीं है। आयात केवल संकलक चेतावनी (त्रुटि नहीं) से बचने के लिए आवश्यक है, क्योंकि जब भी आप अपने कोड में कहीं से भी [UIAplplication sharedAplication] को कॉल कर सकते हैं और यह आयात के संबंध में काम करेगा, यह भी है कि XD कोरडाटा ऐप के लिए जेनरेट करता है, यह आश्चर्यजनक है मैं आपको यह गलत क्यों कहता हूं, और संदर्भ को इस तरह से पारित करना पसंद करता हूं। कोरडाटा एक्सेसर्स को केंद्रीकृत करके आप त्रुटि, आलसी लोडिंग, जो कुछ भी आपको पसंद करते हैं, को बचाने के लिए अधिक नियंत्रण प्राप्त करते हैं। – Leonardo

+0

http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html "गलत" शायद सही शब्द नहीं था। मैं इष्टतम की तलाश में हूं। –

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