2010-08-14 14 views
16

Jestem nowy w rozwoju iOS i mam problem z plikami nagłówkowymi. Występuje problem z zależnością cykliczną w moich plikach nagłówkowych. Moja klasa delegat aplikacja zawiera wskaźnik do moim zdaniem regulatora, ponieważ muszę ustawić jedną z właściwości sterownika widok w moim sposobie didFinishLaunchingWithOptions ...Jak rozwiązać tę zależność cykliczną?

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

a moim zdaniem regulatora, ja odwołać „myFlag” własność , to w moim app delegata ...

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

jednak w celu uzyskania dostępu do „myFlag” własność w moim app delegata, muszę zaimportować plik nagłówka App której przekazano. To właśnie powoduje zależność cykliczną. Nie wiesz, jak rozwiązać ten problem, czy ktoś na to wpadł?

Z góry dziękuję za pomoc!

+0

+1 .. Świetne pytanie. – iwasrobbed

+0

Uwielbiam to. \t help 5 więcej do przejścia .. – Mel

Odpowiedz

18

Nie #import "MyViewController.h" w appDelegate.h. Zamiast tego, prześlij dalej - deklaruj klasę.

@class MyViewController; 

@interface appDelegate 

    NSManagedObjectContext *managedObjectContext; 

    MyViewController *viewController; 
    BOOL myFlag; 

@end 

Ponadto, nie trzeba do #import "appDelegate.h" w MyViewController.h jeśli wszystko, co potrzebne jest, aby odwoływać się do własności myFlag w realizacji. Zamiast tego zaimportuj go do pliku MyViewController.m.

1

Nie przeczytałem wszystkiego, ale możesz wykonywać przekazywanie deklaracji w klasie @. Zwykle jak rozwiązywać zależności cykliczne.

2

@klasa to podejście syntaktyczne, którego szukasz.

Wielu programistów unika tej okrągłości (która łączy klasy w dwóch kierunkach, co oznacza, że ​​kontroler widoku może być używany tylko w okolicznościach, w których aplikacja deleguje ten BOOL). Istnieje kilka sposobów można to zrobić:

  • Move zmiennej stanu do Singleton
  • mieć kontroler widoku pobrania wartości poprzez interfejs że delegat implementuje
  • klucz-wartość Obserwując (które swoimi delegat aplikacji skonfiguruje na swoim kontrolerze podglądu)

W przypadku małych projektów ten rodzaj zależności prawdopodobnie nie stanowi problemu, ale wraz ze wzrostem rozmiaru projektu i wzrostem zapotrzebowania na ponowne użycie kodu czysta separacja funkcjonalna staje się coraz bardziej wartościowa .

Powiązane problemy