2

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

- (void) displayCrosshair{

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

}

给了我一个错误:

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

我知道self.canvas从类内部只要我没有在类中创建另一个画布,只要我想在主画布上添加 Shape 并且只是以处理对象的方式使用该方法,这是不正确的。那么,这样做的正确方法是什么?

4

1 回答 1

1

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

您可以像这样发布通知:

@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

...然后在您构建子类时对您的画布进行硬引用,C4WorkSpace.m如下所示:

@implementation C4WorkSpace {
    MyClass *obj;
}

-(void)setup {
    obj = [[MyClass alloc] init];
    obj.canvas = self.canvas;
    [self.canvas addSubview:obj];
}

这个技巧应该有效,但我更喜欢通知方法。


最后的想法......如果你正在谈论的子类对象实际上十字准线,那么我什至不会打扰到画布的通知。

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

在画布上:

-(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

这可能是最好的方法。

于 2013-04-08T17:29:03.557 回答