2010-08-14 17 views
16

मैं आईओएस विकास के लिए नया हूं और मेरी हेडर फाइलों के साथ किसी समस्या में भाग रहा हूं। मैं अपनी शीर्षलेख फ़ाइलों के साथ एक परिपत्र निर्भरता मुद्दे में भाग रहा हूं। मेरा आवेदन प्रतिनिधि वर्ग, मेरे विचार नियंत्रक के लिए सूचक होता है के बाद से मैं अपने didFinishLaunchingWithOptions विधि में दृश्य नियंत्रक के गुणों में से एक स्थापित करने के लिए है ...मैं इस परिपत्र निर्भरता को कैसे हल करूं?

//appDelegate.h  //DISCLAIMER: THIS IS UNTESTED CODE AND WRITTEN ON THE FLY TO ILLUSTRATE MY POINT 
#import <UIKit/UIKit.h> 
#import "MyViewController.h" 

@interface appDelegate 

    NSManagedObjectContext *managedObjectContext; 

    MyViewController *viewController; 
    BOOL myFlag; 

@end 

//appDelegate.m 
@implementation appDelegate 

- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    viewController.managedObjectContext = self.managedObjectContext; 
    . 
    . 
    . 
} 
@end 

और मेरे विचार नियंत्रक में, मैं संदर्भ "myFlag" संपत्ति , कि मेरे ऐप प्रतिनिधि में है ...

//MyViewController.h           
#import "appDelegate.h"  //<---circular dependency, causing "Expected specifier-qualifier-list before MyViewController" errors in my appDelegate header file 

@interface MyViewController: UIViewController 
{ 
    NSManagedObjectContext *managedObjectContext; 
} 
@end 

//MyViewController.m 
@import "MyViewController.h" 

@implementation MyViewController 

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 

    ((appDelegate*)[[UIApplication sharedApplication] delegate]).myFlag = NO; 
} 

@end 

लेकिन मेरे एप्लिकेशन प्रतिनिधि में "myFlag" संपत्ति तक पहुँचने के लिए, मैं अनुप्रयोग प्रतिनिधि के हेडर फ़ाइल आयात करने की जरूरत है। यह परिपत्र निर्भरता का कारण बन रहा है। यह सुनिश्चित नहीं है कि इसे कैसे हल किया जाए, क्या इसमें कोई भी भाग लेता है?

आपकी मदद के लिए अग्रिम धन्यवाद!

+0

+1 .. महान प्रश्न। – iwasrobbed

+0

मुझे यह पसंद है। \t सहायता 5 और जाने के लिए .. – Mel

उत्तर

18

में मत करो। इसके बजाय, कक्षा को आगे घोषित करें।

@class MyViewController; 

@interface appDelegate 

    NSManagedObjectContext *managedObjectContext; 

    MyViewController *viewController; 
    BOOL myFlag; 

@end 

इसके अलावा, आप MyViewController.h में #import "appDelegate.h" की जरूरत नहीं है, तो आप सभी की जरूरत कार्यान्वयन में myFlag संपत्ति संदर्भ के लिए है। इसके बजाय, इसे MyViewController.m फ़ाइल में आयात करें।

1

सब कुछ नहीं पढ़ा, लेकिन आप @class के साथ घोषणाएं आगे कर सकते हैं। आमतौर पर मैं परिपत्र निर्भरताओं को कैसे हल करता हूं।

2

@class वह वाक्य रचनात्मक दृष्टिकोण है जिसे आप ढूंढ रहे हैं।

कई कोडर इस परिपत्र से बचने के लिए देख रहे हैं (जो आपके वर्गों को दो दिशाओं में जोड़ता है, जिसका अर्थ है कि आपका व्यू कंट्रोलर केवल उन परिस्थितियों में उपयोग किया जा सकता है जहां ऐप प्रतिनिधि के पास वह बूल है)। कुछ तरीके हैं जिन्हें आप ऐसा कर सकते हैं:

  • ले जाएँ एक सिंगलटन
  • दृश्य नियंत्रक है करने के लिए राज्य चर एक अंतरफलक है कि प्रतिनिधि को लागू करता है
  • मुख्य मान अवलोकन के माध्यम से मूल्य लाने (जो आपके एप्लिकेशन प्रतिनिधि आपके विचार नियंत्रक पर कॉन्फ़िगर हैं)

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

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