का उपयोग स्टोरीबोर्ड आप (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;
}
मुझे पता है कि आप ऐसा कर सकते हैं लेकिन मैं इससे बचने की कोशिश कर रहा हूं। स्पष्ट रूप से स्पष्ट नहीं कर सकता कि यह गलत क्यों है लेकिन ऐसा लगता है कि, # हर जगह AppDelegate आयात करना। –
यह गलत नहीं है, यह करने का तरीका है, जब आप इसे आसानी से एक्सेस कर सकते हैं तो संदर्भ पारित करने में कोई बात नहीं है। आयात केवल संकलक चेतावनी (त्रुटि नहीं) से बचने के लिए आवश्यक है, क्योंकि जब भी आप अपने कोड में कहीं से भी [UIAplplication sharedAplication] को कॉल कर सकते हैं और यह आयात के संबंध में काम करेगा, यह भी है कि XD कोरडाटा ऐप के लिए जेनरेट करता है, यह आश्चर्यजनक है मैं आपको यह गलत क्यों कहता हूं, और संदर्भ को इस तरह से पारित करना पसंद करता हूं। कोरडाटा एक्सेसर्स को केंद्रीकृत करके आप त्रुटि, आलसी लोडिंग, जो कुछ भी आपको पसंद करते हैं, को बचाने के लिए अधिक नियंत्रण प्राप्त करते हैं। – Leonardo
http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html "गलत" शायद सही शब्द नहीं था। मैं इष्टतम की तलाश में हूं। –