2010-08-14 3 views
16

Я новичок в разработке iOS и сталкиваюсь с проблемой с моими заголовочными файлами. Я столкнулся с проблемой циклической зависимости с моими заголовочными файлами. Мой класс приложения делегат содержит указатель на мой взгляд контроллера, так как я должен установить один из свойств контроллера представления в моем методе 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 help 5 еще ... – Mel

ответ

18

Не #import "MyViewController.h" в appDelegate.h. Вместо этого forward-declare класс.

@class MyViewController; 

@interface appDelegate 

    NSManagedObjectContext *managedObjectContext; 

    MyViewController *viewController; 
    BOOL myFlag; 

@end 

Кроме того, вам не нужно #import "appDelegate.h" в MyViewController.h, если все, что вам нужно ссылаться на myFlag недвижимость в реализации. Вместо этого импортируйте его в файл MyViewController.m.

1

Не читал все, но вы можете делать декларации с помощью @class. Обычно я решаю круговые зависимости.

2

@class - синтаксический подход, который вы ищете.

Многие кодеры стремятся избежать этой округлости (которая соединяет ваши классы в двух направлениях, что означает, что ваш контроллер просмотра может использоваться только в тех случаях, когда делегат приложения имеет этот BOOL). Есть несколько способов, вы можете сделать это:

  • Move состояние переменной одноточечного
  • Have контроллер представления получить значение через интерфейс, делегат реализует
  • Key-Value Наблюдения (которой ваш приложение делегат будет настроить на контроллере представления)

Для небольших проектов такого рода зависимости, вероятно, на самом деле не проблема, но как проект размера растет и желательность повторного использования коды растет, чистое функциональное разделение становится все более и более ценными ,

Смежные вопросы