是的,另一个新手问题 - 流程/工作流程问题。请耐心等待。
我有一个NSTimer对象,计时器,在一个方法methA中创建,被传递给另一个方法methB,用于控制某些处理。两种方法都属于同一类。
我有touchesBegin和touchesEnded方法来捕获用户输入。这些方法与我之前的两个方法 - methA和methB属于同一类。当用户“点击”我的屏幕时,我需要停止处理
当我通过点击调用touchesBegin方法时,我假设我要做的就是向我的其他方法发送消息,methA / methB,并告诉他们停止处理。我假设我所要做的就是使传递给我的“处理”方法的计时器无效,即methB。
这听起来不错吗?我已经包含了我的四种方法touchesBegin,methA和methB。任何意见都非常感谢。
- (void) methA
{
stepValue = 0;
animationBuild = YES;
float duration = [[[Config shared] valueForKey:@"animation.val.step_duration"] floatValue];
[NSTimer scheduledTimerWithTimeInterval:duration target:self selector:@selector(stepValue:) userInfo:nil repeats:YES];
}
- (void) methB:(NSTimer *) timer
{
if (animationBuild)
{
// animation logic/processing
}
// Next step
stepValue++;
if (stepValue == GROUP_SIZE)
{
[timer invalidate];
[self animateShowMessage];
}
}
- (void) touchesBegan:(NSSet *) touches withEvent:(UIEvent *) event
{
if (modalDialog)
{
return;
}
if (currentTouch == nil)
{
UITouch *touch = [[touches allObjects] objectAtIndex:0];
currentTouch = [touch retain];
}
}
- (void) touchesEnded:(NSSet *) touches withEvent:(UIEvent *) event
{
if (modalDialog)
{
return;
}
UITouch *touch = [[touches allObjects] objectAtIndex:0];
if ((touch != nil) && (touch == currentTouch))
{
CGPoint touchPoint = [touch locationInView:self.view];
else if ((CGRectContainsPoint(visRect[[Process shared].procType], point)) && (touch.tapCount == 2))
{
// processing
}
else
{
// Start a new processing
[self startNew];
}
[currentTouch release];
currentTouch = nil;
}
}
答案 0 :(得分:2)
这基本上是正确的,但是,我会做一些设计更改。
除非您正在为iOS 3.x之前的应用构建,否则您应该使用UIGestureRecognizer
来识别点击,而不是旧的touchesBegan方法。使用识别器非常简单:
UITapGestureRecognizer *tapRecognizer =
[[[UITapGestureRecognizer alloc] initWithTarget:self
action:@selector(handleTap:)] autorelease];
[self.view addGestureRecognizer:tapRecognizer];
我通常不喜欢在我的代码中有多个地方修改计时器。如果您在整个代码中分散了计时器修改,则可能会错过无效或在某处释放。所以,我通常创建一个计时器属性,如下例所示。如果您使用这样的属性,更改计时器对象或将计时器设置为nil将自动使其无效,因此保证永远不会处于时髦状态。
- (void)setTimer:(NSTimer *)newTimer {
[_timer invalidate];
[newTimer retain];
[_timer release];
_timer = newTimer;
}