Круглые вопросы импорта в Objective C & Cocoa Touch - PullRequest
4 голосов
/ 14 октября 2011

У меня есть контроллер вида в Cocoa Touch, который обнаруживает, когда устройство вращается, и переключается между видами двух контроллеров представления: ландшафт и портрет.

Я хочу, чтобы UIViewControllers в нем имел доступ к FRRRotatingViewController, так же как все UIViewControllers могут получить доступ к UINavigationController, в котором они находятся.

Итак, я создал UIViewController подкласс (FRRViewController), который будет иметь свойство rotatingViewController.

Я также изменил FRRRotatingViewController, поэтому вместо обычного UIViewControllers.

требуется FRRViewControllers.

К сожалению, когда я включаю FRRRotatingViewController.h в FRRViewController.h (и наоборот), я, кажется, попадаю в круговую проблему импорта. Я не знаю, как это исправить. Есть предложения?

Вот код:

//
//  FRRViewController.h

#import <UIKit/UIKit.h>
#import "FRRRotatingViewController.h"

@interface FRRViewController : UIViewController

@end

//
//  FRRRotatingViewController.h

#import <UIKit/UIKit.h>
#import "FRRViewController.h"

@class FRRRotatingViewController;


@protocol FRRRotatingViewControllerDelegate

-(void) FRRRotatingViewControllerWillSwitchToLandscapeView: (FRRRotatingViewController *) sender;
-(void) FRRRotatingViewControllerWillSwitchToPortraitView: (FRRRotatingViewController *) sender;

@end


@interface FRRRotatingViewController : FRRViewController {
    // This is where I get the error:Cannot find interface declaration for
    // 'FRRViewController', superclass of 'FRRRotatingViewController'; did you 
    // mean 'UIViewController'?
}

@property (strong) UIViewController *landscapeViewController;
@property (strong) UIViewController *portraitViewController;

@property (unsafe_unretained) id<FRRRotatingViewControllerDelegate> delegate;

-(FRRRotatingViewController *) initWithLandscapeViewController: (UIViewController *) landscape andPortraitViewController: (UIViewController *) portrait;
-(void) deviceDidRotate: (NSNotification *) aNotification;

@end

Ответы [ 2 ]

17 голосов
/ 14 октября 2011

Вы можете использовать предварительные объявления для классов и протоколов в заголовках в большинстве ситуаций, чтобы избежать проблем циклического импорта, за исключением случая наследования.В FRRViewController.h вместо импорта FRRRotatingViewController.h нельзя ли сделать предварительное объявление?

@class FRRRotatingViewController;
4 голосов
/ 14 октября 2011

Если я правильно читаю, ваша структура наследования выглядит так:

UIViewController -> FRRViewController -> FRRRotatingViewController

Но вы сделали объявление FRRViewController зависимым от импорта файла из его подкласса, FRRRotatingViewController. Поэтому компилятор будет импортировать и читать FRRRotatingViewController перед обработкой остальной части FRRViewController.h.

Я предполагаю, что вы пропустили некоторые из FRRViewController.h, так как там нет ссылки на какие-либо вращающиеся контроллеры представления, но если вы объявляете свойство в .h FRRRotatingViewController, то вам нужно использовать forward объявление в FRRViewController.h:

@class FRRRotatingViewController

вместо

#import "FRRRotatingViewController.h"

Последняя строка, вы можете поместить в первую строку вашего FRRViewController.m файла.

...