0

我不是白痴,但头文件有时让我觉得自己像个白痴。我有一个可能过于复杂的设置,它有一个我无法解决的错误。这是我能做到的尽可能简单的细节......

  • 我有一个包含模型类的控制器类。
  • 我有一个场景类来捕获动作并与控制器通信。
  • 我有一个与模型类对话以输出模型状态的图层类。
  • Scene 类包含仅用于输出的 Layer 类。
  • 场景必须包含 Cocos2D 框架确定的层。
  • 特定的场景类派生自持有对控制器类的引用的 RootScene 类。
  • 特定的 Layer 类派生自 RootLayer 类,该类包含对 Model 类的引用。
  • Controller负责创建Scene,Scenes负责创建Layer。

当创建一个层并将控制器的模型传递给层的模型(在 中AScene.m)时,问题就出现了。我收到“在非结构或联合的情况下请求成员‘模型’”。铸造不起作用,我不知道如何让这些类相互交谈。我认为部分问题可能是 Controller 类包含 Model 类。

控制器.h

#import <Foundation/Foundation.h>

@class Model;
@class AScene;

@interface Controller : NSObject {
    Model *Model;
}
@property (nonatomic, retain) Model *Model;
-(void)runScene;

控制器.m

#import "Controller.h"

#import "Model.h"
#import "AScene.h"

@implementation Controller

@synthesize Model;

- (void)runScene {
    AScene *newScene = [[AScene alloc] init];
    newScene.controller = self;
}

根场景.h

#import "cocos2d.h"

@class Controller;

@interface RootScene : Scene {
    Controller *controller;
}
@property (nonatomic, retain) Controller *controller;

@end

根场景.m

#import "RootScene.h"
#import "Controller.h"

@implementation RootScene

@synthesize controller;

- (id) init {
    self = [super init];
    if (self != nil) {
        //
    }
    return self;
}

- (void) dealloc {
    [controller release];
    [super dealloc];
}

@end

AScene.h

#import "RootScene.h"

@class ALayer;
@class Model;

@interface AScene : RootScene {
}

@end

AScene.m

#import "AScene.h"
#import "ALayer.h"
#import "Model.h"

@implementation AScene

- (id) init {
    self = [super init];
    if (self != nil) {
        ALayer *newLayer = [ALayer node];
        newLayer.model = controller.Model; // <-- Request for member 'Model' in something not a stucture or union
        [self addChild:statusScreenLayer];
    }
    return self;
}

- (void) dealloc {
    [super dealloc];
}

@end

根层.h

#import "cocos2d.h"

@class Model;

@interface RootLayer : Layer {
    Model *model;
}
@property (nonatomic, retain) Model *model;

@end

根层.m

#import "RootLayer.h"

#import "Model.h"

@implementation RootLayer

@synthesize model;

- (id) init {
    self = [super init];
    if (self != nil) {
        //
    }
    return self;
}

- (void) dealloc {
    [model release];
    [super dealloc];
}

@end

图层.h

#import "RootLayer.h"

@interface ALayer : RootLayer {
}
-(void) draw;

@end

图层.m

#import "ALayer.h"

@implementation ALayer

-(void) draw {
    // draw based on state of the model
}

@end
4

2 回答 2

3

您的实现AScene不是.#importController

编辑:显式解决方案。

在 AScene.m 中添加:

#import "Controller.h"
于 2009-10-24T21:54:02.923 回答
1

尼古拉似乎是对的。除此之外,最佳实践将规定属性(如 ivars)不应以大写字母开头。你只是在寻求伤害。改用这些:

控制器.h

@interface Controller : NSObject {
    Model *model;
}
@property (nonatomic, retain) Model *model;

控制器.m

@synthesize model;
于 2009-10-26T19:50:43.053 回答