Class 创建类C4

Class 创建类C4,class,c4,Class,C4,我正试图在C4 Libpd项目中编写一个新类。我想做的就是,只要我想学习如何在Objective-C中管理类,从我用更面向对象的方式编写的“顺序”代码中获得功能。 我遇到的问题之一是如何将“addShape”作为新类的方法添加到画布上: - (void) displayCrosshair{ [self.canvas addShape:xLine]; [self.canvas addShape:yLine]; [self.canvas addShape:s]; } 给

我正试图在C4 Libpd项目中编写一个新类。我想做的就是,只要我想学习如何在Objective-C中管理类,从我用更面向对象的方式编写的“顺序”代码中获得功能。 我遇到的问题之一是如何将“addShape”作为新类的方法添加到画布上:

- (void) displayCrosshair{

    [self.canvas addShape:xLine];
    [self.canvas addShape:yLine];
    [self.canvas addShape:s];

}
给我一个错误:

在类型为的对象上找不到属性画布


我从类内部了解到,
self.canvas
这是不正确的,只要我没有在类内部创建另一个画布,只要我想在主画布上添加形状,并且只是以处理对象的方式使用该方法。那么,哪种方法是正确的呢?

当一个方法或动作发生在一个单独的对象中时,让事情发生在画布上的最简单方法之一就是使用通知。使用通知可以做两件事,它允许其他对象以自己的方式对事件做出反应,并允许对对象的解耦(即不硬编码)引用

您可以像这样发布通知:

@interface MyClass : C4Shape
-(void)displayCrosshair;
@end

@implementation MyClass
-(void)displayCrosshair {
    [self postNotification:@"displayCrosshairNotification"];
}
@end
然后,要让画布侦听通知,可以执行以下操作:

-(void)setup {
    C4Shape *crossHair = ...;
    crossHair.hidden = YES;
    [self.canvas addShape:crossHair];
    [self listenFor:@"displayCrosshairNotification" fromObject:obj andRunMethod:@"displayCrosshair"];
}

-(void)displayCrosshair {
    crossHair.hidden = NO;
}

或者,您可以在画布的子类中设置属性:

@interface MyClass : C4Shape
@property (readwrite, nonatomic) C4View *canvas;
@end
-(void)setup {
    MyShape *crossHair = [[MyShape alloc] initWithFrame:...];
    [self.canvas addShape:crosshair];
}
…然后在
C4WorkSpace.m
中构建子类时硬引用画布,如下所示:

@implementation C4WorkSpace {
    MyClass *obj;
}

-(void)setup {
    obj = [[MyClass alloc] init];
    obj.canvas = self.canvas;
    [self.canvas addSubview:obj];
}
这个技巧应该有效,但我更喜欢通知方法


最后一个想法。。。如果你所说的子类对象实际上是十字线,那么我甚至不会为画布的通知而烦恼

相反,我会将crosshair创建为C4Shape的子类,并让它管理自己的可见性:

在画布上:

@interface MyClass : C4Shape
@property (readwrite, nonatomic) C4View *canvas;
@end
-(void)setup {
    MyShape *crossHair = [[MyShape alloc] initWithFrame:...];
    [self.canvas addShape:crosshair];
}
在您的形状子类中:

@interface MyShape : C4Shape
-(void)displayCrosshair;
-(void)hideCrosshair;
@end

@implementation MyShape
-(void)setup {
    [self addShape:xLine];
    [self addShape:yLine];
    [self hideCrosshair];
}

-(void)displayCrosshair {
    self.hidden = NO;
}

-(void)hideCrosshair {
    self.hidden = YES;
}
@end

哪种可能是最好的方法。

那么“反对”呢?我的意思是,如果我想从主画布(如self.canvas.width或类似)获取类的方法“propertys”?到目前为止,我通过将包含任何内容的点作为参数发送给方法来硬编码。然后,第二个选项是您正在寻找的,通过设置一个“是”画布的属性,那么对象将始终以这种方式引用画布。