C4Shape的子类不会成为实例方法的一个行

时间:2013-11-03 03:11:42

标签: c4

我创建了一个名为Lines的子类,它继承自C4Shape。现在,它只是在调用类方法时创建一个随机行。

意图是每一个新行都从前一行的pointB开始(即终点),以便创建一个连续的行树。最终,我将从同一个终点产生多条线,旧的线条消失,等等。这是我到目前为止的代码:

+(Lines *)createLineFromPoint:(CGPoint)startPoint {
CGPoint endPoint = CGPointMake([C4Math randomIntBetweenA:(startPoint.x-50) andB:(startPoint.x+50)],
                               [C4Math randomIntBetweenA:(startPoint.y-50) andB:(startPoint.y+50)]);
CGPoint linePoints[2] = {startPoint, endPoint};
Lines *newLine = [Lines new];
[newLine line:linePoints]; //This should make newLine a line type, should it not?
newLine.lineWidth = 3.0f;

return newLine;
}

-(void) setup {
[self performSelector:@selector(continueMakingLinesWithLine) withObject:(self) afterDelay:(3.0)];
}

-(void) continueMakingLinesWithLine {
[self.arrayOfLines addObject:[Lines createLineFromPoint:self.pointB]];
}

据我所知,它应该在C4WorkSpace中第一次调用continueMakingLinesWithLine后循环;第一个调用使用随机生成的CGPoint进行实例化。

但是,我很难正确访问在上次调用方法期间设置的pointB属性。

我收到一个错误,告诉我这是因为C4Shape *(Lines *)不是类型行或弧。

但是,实例方法应该是那种类型,不应该吗?

1 个答案:

答案 0 :(得分:1)

我不确定你的实际错误意味着什么。你的逻辑非常正确。

首先,在您的代码中,您有以下内容:

[newLine line:linePoints]; //This should make newLine a line type, should it not?

答案是YES,它就是!

我将您的代码复制到一个新项目中,并在创建时将每一行添加到画布中。跑了,虽然不是我预期的方式。 然而,这不是你的错。

您实际上在[shapeObj line:...]方法的实现中发现了一个小错误。

我将修复GitHub上的C4iOS项目中的错误,但是这不会出现在您的项目中,而是使用当前的安装程序。

解决方法

你可以做以下两件事之一:

1)从你的行子类返回C4Shape并使用[C4Shape line:linePoints]

初始化它

2)将以下内容添加到line 400的{​​{1}}:

C4Shape.m

对于if(CGRectEqualToRect(CGRectZero, self.frame)) { self.frame = lineRect; },您的方法应如下所示:

1)

对于+(Lines *)createLineFromPoint:(CGPoint)startPoint { CGPoint endPoint = CGPointMake([C4Math randomIntBetweenA:.. andB:..], [C4Math randomIntBetweenA:.. andB:..]); CGPoint linePoints[2] = {startPoint, endPoint}; C4Shape *newLine = [C4Shape line:linePoints]; newLine.lineWidth = 3.0f; return (Lines *)newLine; } 2)中方法的结尾应如下所示:

C4Shape.m

如果您执行-(void)_line:(NSArray *)pointArray { //Default implementation //.. //.. newBounds.origin = CGPointZero; if(CGRectEqualToRect(CGRectZero, self.frame)) { self.frame = lineRect; } CGPathRelease(newPath); _initialized = YES; } ,则无需修复当前的2)方法。

其他事情

我收紧了您在上面发布的代码,如下所示:

+(Lines *)

@interface C4WorkSpace () @property NSMutableArray *arrayOfLines; @end @implementation C4WorkSpace -(void) setup { self.arrayOfLines = [@[] mutableCopy]; Lines *newLine = [Lines createLineFromPoint:self.canvas.center]; [self.arrayOfLines addObject:newLine]; [self.canvas addShape:newLine]; [self continueMakingLinesWithLine]; } -(void) continueMakingLinesWithLine { CGPoint p = ((Lines *)[self.arrayOfLines lastObject]).pointB; Lines *newLine = [Lines createLineFromPoint:p]; [self.arrayOfLines addObject:newLine]; [self.canvas addShape:newLine]; [self runMethod:@"continueMakingLinesWithLine" afterDelay:1.0f]; } @end 中,我创建第一行并将其添加到画布和数组中。然后,我让setup方法找到前一行,构建一个新行,然后再次调用自己。