首页
学习
活动
专区
圈层
工具
发布

创建类C4
EN

Stack Overflow用户
提问于 2013-04-08 14:49:58
回答 1查看 79关注 0票数 2

我试图在一个C4-Libpd项目中编写一个新的类。我所要做的就是,只要我想学习如何管理Object中的类,就可以从我编写的更面向对象的代码中获得功能。我遇到的问题之一是如何将"addShape“作为新类的一种方法:

代码语言:javascript
复制
- (void) displayCrosshair{

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

}

我犯了一个错误:

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-08 17:29:03

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

您可以这样发布通知:

代码语言:javascript
复制
@interface MyClass : C4Shape
-(void)displayCrosshair;
@end

@implementation MyClass
-(void)displayCrosshair {
    [self postNotification:@"displayCrosshairNotification"];
}
@end

然后,要让画布侦听通知,可以这样做:

代码语言:javascript
复制
-(void)setup {
    C4Shape *crossHair = ...;
    crossHair.hidden = YES;
    [self.canvas addShape:crossHair];
    [self listenFor:@"displayCrosshairNotification" fromObject:obj andRunMethod:@"displayCrosshair"];
}

-(void)displayCrosshair {
    crossHair.hidden = NO;
}

或者,您可以在您的子类中为画布设置一个属性:

代码语言:javascript
复制
@interface MyClass : C4Shape
@property (readwrite, nonatomic) C4View *canvas;
@end

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

代码语言:javascript
复制
@implementation C4WorkSpace {
    MyClass *obj;
}

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

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

最后一个想法..。如果您正在讨论的子类对象实际上是,那么我甚至不会为通知画布而费心。

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

在画布上:

代码语言:javascript
复制
-(void)setup {
    MyShape *crossHair = [[MyShape alloc] initWithFrame:...];
    [self.canvas addShape:crosshair];
}

在您的形状子类中:

代码语言:javascript
复制
@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

这可能是最好的方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15882251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档