C4Shape Custom Subclass init问题?

时间:2013-05-04 22:20:06

标签: ios c4

之前我曾就此项目提出过另一个问题,特拉维斯非常乐于助人。 Previous question

考虑到这个建议我正在尝试为C4Shape类创建一个子类,我在类中为X和Y位置值添加了2个属性(两个浮点数)。我不只是调用C4Shape的.center属性的原因是因为要将它们添加到画布我更喜欢使用左上角而不是中心。

我正在尝试为这个新类编写自定义Init方法,但是我收到了一个错误。

这是我正在使用的自定义初始化代码:

customShape.m

- (id)initWithColor:(UIColor *)fillColor atX:(float)_xValue atY:(float)_yValue
{
CGRect frame = CGRectMake(_xValue, _yValue, 100, 100);
self = [customShape rect:frame];

self.lineWidth = 0.0f;
self.fillColor = fillColor;
self.xValue = _xValue;
self.yValue = _yValue;


return self;
}

C4WorkSpace.m

-(void)setup {
customShape *testShape = [[customShape alloc]initWithColor:[UIColor greenColor] atX:50.0f atY:50.0f];

[self.canvas addShape:testShape];
}

我怀疑罪魁祸首是self = [customShape rect:frame];这是我看到的警告:“不兼容的指针类型从'C4Shape *'分配'customeShape * _strong'”

我尝试运行时抛出的实际错误是:“由于未捕获的异常终止应用程序'NSInvalidArgumentException',原因:' - [C4Shape setXValue:]:无法识别的选择器发送到实例0x9812580'”

和以前一样,我正在制作可以保存颜色值的按钮,当你点击那个按钮时,它会发送一个带有按钮fillColor和iPads IP的UDP数据包。

1 个答案:

答案 0 :(得分:2)

您对init方法的实现非常接近。我会用以下方式重组它:

- (id)initWithColor:(UIColor *)aColor origin:(CGPoint)aPoint {
    self = [super init];
    if(self != nil) {
        CGRect frame = CGRectMake(0,0, 100, 100);
        [self rect:frame];
        self.lineWidth = 0.0f;
        self.fillColor = aColor;
        self.origin = aPoint;
    }
    return self;
}

有几点需要注意:

  1. 当继承它时,总是可以调用对象超类的init方法
  2. 最好将子类的init包装在if语句中,检查超类init是否正确返回。
  3. 为新对象创建一个框架,并直接在rect:上致电self
  4. 每个可见的C4对象都有一个origin点,因此您可以直接使用x设置原点,而不是直接使用yCGPoint值。 origin是左上角。
  5. 然后,您需要将此方法添加到.h文件中:

    @interface MyShape : C4Shape
    -(id)initWithColor:(UIColor *)aColor origin:(CGPoint)aPoint;
    @end
    

    最后,您可以在C4WorkSpace中创建形状,如下所示:

    MyShape *m = [[MyShape alloc] initWithColor:[UIColor darkGrayColor]
                                         origin:CGPointMake(100, 100)];
    

    并且,如果您为点击方法添加一行,您可以检查按钮的原点:

    -(void)heardTap:(NSNotification *)aNotification {
        MyShape *notificationShape = (MyShape *)[aNotification object];
        C4Log(@"%4.2f,%4.2f",notificationShape.center.x,notificationShape.center.y);
        C4Log(@"%4.2f,%4.2f",notificationShape.origin.x,notificationShape.origin.y);
        C4Log(@"%@",notificationShape.strokeColor);
    }
    

    虽然您可以使用xy值作为属性,但我建议您使用CGPoint结构。它几乎是相同的,除非你从C4进展到Objective-C,你会发现CGPoint和其他CG几何结构被到处使用