我知道这些NSTimer
问题已经出现了很多次,但是由于似乎没有一个涉及执行更改 UI 的块,我认为这仍然是一个原始问题。
我有一个子类UIButton
,为了方便起见(我,来自Android
背景),有一个onClick
和onHoldClick
功能。onClick
只需获取一个块并在响应的选择器中执行它UIControlEventTouchUpInside
。点击功能很好用。例如:
[myButton setOnClick:^{
NSLog(@"clicked");
}];
保持点击功能效果不佳。
[myButton setOnHoldClick:^{
NSLog(@"still holding click...");
}];
这会监听UIControlEventTouchDown
事件,并在延迟后执行任务:
- (void)clickDown:(id)sender
{
isClicked = YES;
[self performSelector:@selector(holdLoop:) withObject:nil afterDelay:delay];//For the sake of the example, delay is set to 0.5
}
保持循环在另一个函数上运行一个重复的计时器,该函数处理块执行(计时器变量是NSTimer
在头文件中声明的):
-(void)holdLoop:(id)sender
{
[self cancelTimers];
_timer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(death:) userInfo:nil repeats:YES];
}
-(void)death:(id)_delay
{
if (isClicked)
{
_holdBlock();
}
else
{
[self cancelTimers];
}
}
执行的块会改变浮点数的值,用于更新标签的值,然后重新绘制。
第一次发生按住单击事件时,效果很好。在那之后,似乎计时器没有被取消,并且仍然添加了新的计时器。这就是我的cancelTimers
函数的样子(这里的调用是从关于这个主题的其他问题的集合中检索的):
-(void)cancelTimers
{
[_timer invalidate];
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(death:) object:nil];
}
我做错了什么,我该如何解决?
编辑
我做的,其实里面已经有响应touch up的功能了:
- (void)clickUp:(id)sender
{
isClicked = NO;
[self cancelTimers];
_clickBlock();
}
此外,我意识到问题来自未处理的取消事件。iOS 是否有理由自动取消我的长按?