2013-04-08 82 views
2

我正在尝试在C4-Libpd项目中编写一个新类。我想要做的只是,我希望学习如何管理Objective-C中的类,从我已经写入更多面向对象方式的“顺序”代码中获取功能。 一个我有烦恼的是如何“addShape”到画布作为新类的方法:创建类C4

- (void) displayCrosshair{ 

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

} 

gaves我一个错误:

Property canvas not found on object of type...

我明白self.canvas从类内部看,只要我没有在类中创建另一个画布,只要我想在主画布上添加Shape并仅使用方法处理对象即可。那么,这是正确的方法呢?

回答

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 

这可能是最好的方法。

+0

那么“au contraire”呢?我的意思是,如果我想从self.canvas.width或类似的主画布中从我的班级的方法“propertys”中获取,到目前为止,我通过发送包含任何方法的点作为参数来硬编码。 – user2258073 2013-04-09 14:21:16

+0

然后第二个选项就是你正在寻找的东西,通过设置一个“是”画布的属性,那么对象总是会以这种方式对画布进行引用。 – 2013-04-09 17:47:38