基于“tap”如何访问计时器对象并停止处理

时间:2011-05-17 06:48:05

标签: iphone objective-c cocoa-touch xcode nstimer

是的,另一个新手问题 - 流程/工作流程问题。请耐心等待。

我有一个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;        
    }
}

1 个答案:

答案 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;
}