忍受我,这个很难解释。我希望那里的一些英雄知道这里发生了什么。需要一些历史;
我的一个可可物,“球”代表一个小图形。它只在视图中有意义。在Ball的一些方法中,它要求视图重绘。最重要的是,它会在设置Ball的位置参数时要求视图重绘。这是在setter中实现的。
这是满口的,如建议的那样:
在View.m
中- (void)mouseUp:(NSEvent *)theEvent {
if (![runnerPath isEmpty]) {
[walkPath removeAllPoints];
[walkPath appendBezierPath:runnerPath];
[runnerPath removeAllPoints];
[[self held] setStep:0];
[[self held] setPath:walkPath];
[NSTimer scheduledTimerWithTimeInterval:.01 target:[self held] selector:@selector(pace) userInfo:nil repeats:YES];
}
}
在Ball.m
- (void)pace {
CGFloat juice = 10;
BOOL loop = YES;
while (loop) {
if ([self step] == [[self path] elementCount]) {
if ([[self timer] isValid]) {
[[self timer] invalidate];
}
[[self path] removeAllPoints];
// @throw([NSException exceptionWithName:@"test" reason:@"reason" userInfo:nil]);
}
if (loop) {
CGFloat distance;
NSPoint stepPoint;
if ([[self path] elementCount] > 0) {
NSPoint returnPoints[2];
[[self path] elementAtIndex:[self step] associatedPoints:returnPoints];
stepPoint = returnPoints[0];
distance = pixelDistance([self position], stepPoint);
}
if (distance <= juice) {
[self setPosition:stepPoint];
if (distance < juice) {
juice -= distance;
loop = YES;
[self setStep:[self step]+1];
} else {
loop = NO;
}
} else {
NSPoint cutPoint = moveAlongBetween([self position], stepPoint, juice);
[self setPosition:cutPoint];
loop = NO;
}
}
}
}
答案 0 :(得分:1)
尝试拨打
for (NSView *each in [self views]) {
...
}
我假设views
是一个数组,所以快速枚举直接应用于它,并且不需要调用allObjects。
其他几点。
答案 1 :(得分:1)
@throw([NSException exceptionWithName:@"test" reason:@"reason" userInfo:nil]);
如果这样做也会解决问题,那么你会在这段代码之后做一些冻结应用程序的事情。
编辑:感谢代码更新。
这里有一些奇怪的东西!我不会重写整个事情,所以这里有一些指示:
while()
循环内暂停执行,因此无论如何都会在闪烁中发生。你需要在课堂上保留一些状态信息。例如。每次调用pace
时添加一个循环计数器。-(void)pace:(NSTimer*)timer
,并使用timer
,而不是[self timer]
(如果您不指定,后者将不再是您的计时器!)-(void)pace:(NSTimer*)timer
,请不要忘记使用@selector(pace:)
(即不要忘记 :
)解决这些问题,如果问题仍然存在,请再次更新您的问题并发表评论,以便我们知道。祝你好运!