当一个方法或动作发生在一个单独的对象中时,在画布上发生事情的最简单方法之一就是使用通知。使用通知可以做两件事情,它允许其他对象以自己的方式对事件做出反应,并且允许对对象的引用进行解耦(即不是硬编码)。
您可以张贴通知如下:
@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
这可能是最好的方法。
那么“au contraire”呢?我的意思是,如果我想从self.canvas.width或类似的主画布中从我的班级的方法“propertys”中获取,到目前为止,我通过发送包含任何方法的点作为参数来硬编码。 – user2258073 2013-04-09 14:21:16
然后第二个选项就是你正在寻找的东西,通过设置一个“是”画布的属性,那么对象总是会以这种方式对画布进行引用。 – 2013-04-09 17:47:38