0

我正在制作一个 Mac OS X 应用程序,我试图让班级彼此了解

控制器创建 View1 和 View2

BaseView 具有 Controller 的属性

View1 和 View2 从 BaseView 扩展而来

这是我的例子

控制器类

#import <Cocoa/Cocoa.h>
#import "View1.h"
@class View1;
@interface Controller : NSViewController
{
    View1 *_view1;
}
@end

//////

#import "Controller.h"

@implementation Controller

- (id) init
{
    self = [super init];
    if( self )
    {
        _view1 = [[View1 alloc] initWithFrame:CGRectZero];
        _view1.controller = self;
    }
    return self;
}
@end

BaseView 类

#import <Cocoa/Cocoa.h>
#import "Controller.h"
@class Controller;
@interface BaseView : NSView
{
    Controller *_controller;
}

@property (nonatomic,assign) Controller *controller;

@end

//////

#import "BaseView.h"

@implementation BaseView

@synthesize controller = _controller;

@end

查看示例类

#import "BaseView.h"

@interface View1 : BaseView

@end

//////

#import "View1.h"

@implementation View1

@end

但它给了我这个错误:

Controller.m:23:16: Property 'controller' cannot be found in forward class object 'View1'

我做错了什么?

4

2 回答 2

1

当您在头文件中使用前向声明时(例如@class View1;),您不需要#import头文件。

在您的 View1.h 中,您没有声明 @class,这就是您得到错误的地方。不过,我建议您在头文件中使用前向声明,并在需要方法声明等时在实现文件中导入所需的头文件 - 这也将防止您出现头文件循环。

你的代码应该看起来像

@class BaseView; 
@interface View1 : BaseView

@end  

////// 

#import "View1.h"
#import "BaseView.h"
@implementation View1  

@end 
于 2012-08-31T12:49:29.850 回答
0

我认为问题可能不在您的代码中。

它们在同一个相对文件夹中吗?是BaseView在不同的位置吗?User Header Search Paths如果是这种情况,您可能必须转到您的项目设置并调整您的

此外,确保所有文件都针对当前运行的目标进行了设置,方法是在项目导航器上单击它们,然后在右侧菜单中检查标记了哪些目标

于 2012-08-31T12:47:45.377 回答