目标C&中的循环导入问题可可触摸

时间:2011-10-14 12:47:57

标签: objective-c cocoa-touch import circular-dependency

我在Cocoa Touch中有一个视图控制器,可以检测设备何时旋转,并在它拥有的2个视图控制器的视图之间切换:横向和纵向。

我希望其中的UIViewControllers能够访问FRRRotatingViewController,方式与所有UIViewControllers可以访问他们所在的UINavigationController类似。< / p>

所以我创建了一个UIViewController子类(FRRViewController),它将具有rotatingViewController属性。

我还修改了FRRRotatingViewController,因此需要FRRViewControllers而非普通UIViewControllers

不幸的是,当我在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 个答案:

答案 0 :(得分:17)

在大多数情况下,您可以在标头中使用类和协议的前向声明,以避免循环导入问题,但继承的情况除外。在FRRViewController.h中,您是否可以不进行FRRRotatingViewController.h进行转发声明?

@class FRRRotatingViewController;

答案 1 :(得分:4)

如果我正确地阅读它,你的继承结构是这样的:

的UIViewController - &GT; FRRViewController - &GT; FRRRotatingViewController

但是你已经使FRRViewController的声明依赖于从其子类FRRRotatingViewController导入文件。因此,编译器将在处理FRRViewController的其余部分之前导入和读取FRRRotatingViewController。

我假设你错过了一些FRRViewController.h,因为那里没有任何旋转视图控制器的引用,但如果你在FRRRotatingViewController的.h中声明一个属性,那么你需要使用一个转发FRRViewController.h中的声明:

@class FRRRotatingViewController

而不是

#import "FRRRotatingViewController.h"

后一行,您可以放入FRRViewController.m文件的第一行。