我想创建类型为ViewController
的变量,该变量在.h文件的开头
KTOneFingerRotationGestureRecognizer.h
#import <UIKit/UIKit.h>
@class ViewController.h;
@interface KTOneFingerRotationGestureRecognizer : UIGestureRecognizer
{
ViewController* mainViewController; // error: Unknown type name `ViewController`; did you mean `UIViewController`?
}
@property (nonatomic, assign) CGFloat rotation;
@property (nonatomic, strong) ViewController* mainViewController; // error: Unknown type name `ViewController`; did you mean `UIViewController`?
@end
我需要将这些变量放在头文件中,因为它们必须是可访问的,并且可以从类外部分配。
由于
编辑:
感谢回复。根据lostInTransit的建议,由于从ViewController
导入KTOneFingerRotationGestureRecognizer
而KTOneFignerRotationGestureRecognizer
导致ViewController
,导致错误发生。根据建议,我将#import "ViewController.h"
更改为@class ViewController;
,删除了错误,但现在我的代码无法使用。
访问ViewController
的目的是我想从ViewController
检索KTOneFingerRotationGestureRecognizer
对象的位置,但@class
声明不允许我访问此对象变量。我将演示。
ViewController.h
#import <UIKit/UIKit.h>
#import "KTOneFingerRotationGestureRecognizer.h"
@interface ViewController : UIViewController
{
UIView* pitchCircleView;
}
@property (nonatomic, strong) UIView* pitchCircleView;
@end
我试图通过以下方式检索它:
KTOneFingerRotationGestureRecognizer.m
float f = mainViewController.pitchCircleView.frame.origin.x;
但它给了我错误:Property pitchCircleView cannot be found in forward class object ViewController
答案 0 :(得分:4)
尝试使用@class
代替#import
。然后在实现中导入。你可能会看到这个因为循环包含(即你的ViewController
类导入KTOneFingerRotationGestureRecognizer
) - 在我们看到一些代码之前无法确定。
答案 1 :(得分:1)
你有循环依赖关系,你可以避免在头文件中使用@class
和在实现文件中使用#import
,但从根本上说你有设计缺陷。
大概你的KTOneFingerRotationGestureRecognizer
想要告诉ViewController
发生了什么事情,所以你应该设计和使用一个协议,它可以通过委托模式传达这些信息。
ViewController
类可以符合该协议,并将自身设置为手势识别器的委托。
这意味着手势识别器可以由符合协议的任何视图控制器使用,而不仅仅是ViewController
,这可以促进代码的重复使用。
这通常用Cocoa类完成。