我正面临与NSTimer
相关的一些问题。我需要在5秒的时间范围内在底部显示UIButton
。我实现了NSTimer
功能,并在那个时间显示了按钮。但是,当我导航到新的View
时。我需要停止NSTimer
或无效。我已在- (void)viewDidDisappear:(BOOL)animated
中完成了这项工作。但是NSTimer
仍在执行中。它在任何时候都没有停止过。下面是我的代码。
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
self._sizeNowButton = [[UIButton alloc]initWithFrame:CGRectMake(0, self.view.frame.size.height+70, 320, 44)];
[TLStylesheet useTurquoiseStyleForButton:self._sizeNowButton withText:NSLocalizedString(@"Size Now", nil) withFontSize:BUTTON_BOTTOM_FONT_SIZE];
[self._sizeNowButton addTarget:self action:@selector(sizeNowClicked) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:self._sizeNowButton];
SEL tSelector = NSSelectorFromString(@"aTimer");
self._aTimer = [NSTimer scheduledTimerWithTimeInterval:10.0 target:self selector:tSelector userInfo:nil repeats:NO];
}
-(void)aTimer
{
self._tTimer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(showButton) userInfo:nil repeats:YES];
}
-(void)showButton {
if([self._sizeNowButton isHidden] )
{
self._sizeNowButton.hidden = NO;
CGRect newFrame = CGRectMake(self._sizeNowButton .frame.origin.x , self._sizeNowButton .frame.origin.y - 44, self._sizeNowButton .frame.size.width, self._sizeNowButton .frame.size.height);
[UIView animateWithDuration:0.5f
delay:0.0
options:UIViewAnimationOptionTransitionFlipFromBottom
animations:^{
[self._sizeNowButton setFrame:newFrame];
}
completion:nil];
}
else
{
CGRect newFrame = CGRectMake(0, self.view.frame.size.height, 320, 44);
[UIView animateWithDuration:0.5f
delay:0.0
options:UIViewAnimationOptionCurveLinear
animations:^{
[self._sizeNowButton setFrame:newFrame];
}
completion:nil];
self._sizeNowButton .hidden = YES;
}
}
- (void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:animated];
[self._tTimer invalidate];
self._tTimer = nil;
self._sizeNowButton = nil;
}
答案 0 :(得分:2)
您正在实例化self._aTimer
但无效self._tTimer
。
当您似乎触发两个不同的计时器(_aTimer
和_tTimer
)时,您需要在viewWillDisappear:
中禁用这两个计时器。
if (self._aTimer)
[self._aTimer invalidate];
self._aTimer = nil;
if (self._tTimer)
[self._tTimer invalidate];
self._tTimer = nil;
答案 1 :(得分:0)
像这样启动计时器
self. _tTimer = [NSTimer timerWithTimeInterval:5.0 target:self selector:@selector(showButton) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:self. _tTimer forMode:NSDefaultRunLoopMode];
[self. _tTimer fire];
并像这样停止 -
if (self. _tTimer)
{
[self. _tTimer invalidate];
self. _tTimer = nil;
}