2

每次我完成我的 NSTimer 时,我都想让它失效并创建一个新的间隔,但它会保留旧的间隔和新的间隔。单击 offButton 后,我想使 NSTimes 无效。计时器停止打印“工作”,但是当我以不同的间隔调用我的方法时,它会为两个间隔打印“工作”。

我的代码是这样的:

-(void) fireTimer{
    NSString *textValue = [sliderLabel text];
    float value = [textValue floatValue];

    [NSTimer scheduledTimerWithTimeInterval:value target:self selector:@selector(vibrate:) userInfo:nil repeats:YES];

}

- (void) vibrate:(NSTimer*)timer {
    if(_offButton.selected){
        [timer invalidate];
        timer=nil;
    }

    NSLog(@"Working");


}
4

2 回答 2

3
  1. 通过直接从UITextField. 这些值应该存储在模型对象中,并使用 MVC 模式将任何新值从文本字段获取到模型中。您当前的实现非常微妙,将在微风中打破。它还要求这段代码能够访问 UI 元素,这是非常不灵活的;最好让它只访问模型对象。

  2. 将 存储NSTimer *为实例变量,并注意,如果您使用 ARC,则NSTimer 保留目标(!!),因此请使用此实例变量__weak来中断保留循环。

  3. 如果您希望计时器重复,则根本无需重置它;仅当用户更改时间时才需要这样做(参见第 1 点!)。

  4. if (button_selected) do_vibrate;代码移动到计时器触发方法中。

于 2013-02-23T14:16:33.773 回答
1

您自己使用的失效代码是正确的。但是,将计时器的引用保留为 ivar 或属性会更容易。

在这种情况下,您肯定会避免创建多个计时器实例。

于 2013-02-23T14:13:34.047 回答