2010-08-14 30 views
16

iOS geliştirmede yeniyim ve başlık dosyamda bir sorunla karşılaşıyorum. Başlık dosyamda döngüsel bir bağımlılık sorunuyla karşılaşıyorum. Benim didFinishLaunchingWithOptions yönteminde görünümü kontrolörün özelliklerden birini ayarlamak zorunda beri yaptığım başvuru temsilci sınıfı Bu dairesel bağımlılığı nasıl çözebilirim?

//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 

Ve görünümü kumandam

, ben "myFlag" özelliği başvuru ..., benim görünümü denetleyicisi bir gösterici içerir o ... benim app temsilci var

//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 

Ama benim app temsilci "myFlag" özelliği erişmek için, ben uygulama temsilcinizin başlık dosyalarını almaları gerekir. Dairesel bağımlılığa neden olan şey budur. Bunu nasıl çözeceğinden emin değil misiniz?

Yardımlarınız için şimdiden teşekkür ederiz!

+0

+1 .. Harika bir soru. – iwasrobbed

+0

Bunu seviyorum. \t yardım 5 tane daha gitme – Mel

cevap

18

appDelegate.h'da #import "MyViewController.h" yazmayın. Bunun yerine, sınıfı ilan edin. İhtiyacınız olan tüm uygulanması yılında myFlag özelliğe başvurmak için ise

@class MyViewController; 

@interface appDelegate 

    NSManagedObjectContext *managedObjectContext; 

    MyViewController *viewController; 
    BOOL myFlag; 

@end 

Ayrıca, MyViewController.h içinde #import "appDelegate.h" gerekmez. Bunun yerine, MyViewController.m dosyasına alın.

1

Her şeyi okumuştunuz, ancak @class ile bildirim yapabilirsiniz. Genellikle dairesel bağımlılıkları nasıl çözerim.

2

@class, aradığınız sözdizimsel bir yaklaşımdır. Birçok kodlayıcı bu döngüden kaçınmaya çalışır (sınıflarınızı iki yönde birleştirir; bu, görünüm denetleyicinizin yalnızca uygulama temsilcisinin bu BOOL'a sahip olduğu durumlarda kullanılabilir) anlamına gelir. Bunu yapmanın birkaç yolu vardır:

  • Taşı
  • görünüm denetleyicisi var bir singleton devlet değişkeni temsilci Gözlem
  • Anahtar Değerini uygulayan bir arayüz üzerinden değerini getirme (hangisi Uygulamanın temsilci bağımlılık bu tür gerçekten muhtemelen bir sorun değil, ama proje olarak temiz fonksiyonel ayrılması daha değerli hale gelir, boyutu büyüdükçe ve kodu yeniden istenilirliği büyür küçük projeler için

) görünümünüzü denetleyicisinde yapılandırmak istiyorum .

İlgili konular