我在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
答案 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
文件的第一行。