我试图在一个C4-Libpd项目中编写一个新的类。我所要做的就是,只要我想学习如何管理Object中的类,就可以从我编写的更面向对象的代码中获得功能。我遇到的问题之一是如何将"addShape“作为新类的一种方法:
- (void) displayCrosshair{
[self.canvas addShape:xLine];
[self.canvas addShape:yLine];
[self.canvas addShape:s];
}我犯了一个错误:
属性画布在类型对象上找不到.
我知道,从类内部的self.canvas --只要我没有在类中创建另一个画布--只要我想在主画布上添加形状,并且只是以处理对象的方式使用该方法,这是不正确的。那么,哪种方法是正确的呢?
发布于 2013-04-08 17:29:03
当方法或操作发生在单独的对象中时,让事情在画布上发生的最简单的方法之一是使用通知。使用通知可以做两件事,它允许其他对象以自己的方式对事件作出反应,并且允许解耦(即不是硬编码)对对象的引用。
您可以这样发布通知:
@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然后,...and在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这可能是最好的方法。
https://stackoverflow.com/questions/15882251
复制相似问题