当方法或动作发生在单独的对象中时,让事情在画布上发生的最简单方法之一是使用通知。使用通知做两件事,它允许其他对象以他们自己的方式对事件作出反应,并且它允许对对象的引用解耦(即非硬编码)。
您可以像这样发布通知:
@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
这可能是最好的方法。