更新
ViewController 没有被销毁,新的 ViewController 没有被创建。这个:
TimerViewController * timerViewController = (TimerViewController *)[segue destinationViewController];
不创建新实例。然而,这
TimerViewController *timerViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"theID"];
做。所以现在正在使用一个新实例,但同样的问题。
结束更新
我有一个简单的“模拟数字计时器”,分钟和秒可以流畅地动画以模拟数字轮的转动。这只是一个带有时间列表的 ParentViewController,选择一个时间对 TimerViewController 执行 segue。TimerViewController 使用递归 UIView 动画来模拟时钟的倒计时。这很好用。
我希望用户能够转换到列表中的下一个计时器,而不必返回 ParentViewController 来选择它。这效果不好。
我尝试了很多变体,基本模式是 TimerViewController 要求其委托(ParentViewController)弹出它,然后使用时间列表中的下一次再次排序到 TimerViewController。初始动画永远不会终止,初始 TimerViewController 实例永远不会“死亡”。当我第二次使用我认为是新实例的 TimerViewController 时,第一个动画似乎仍在运行,动画的持续时间几乎是 1.0 秒,超出了图表(接近 0)。
我尝试了许多不同的、越来越绝望的方法来停止原始动画并杀死原始实例。
ParentViewController.m
-(void) timerViewControllerDidSwipe (TimerViewController *)controller {
[self.navigationController popViewControllerAnimated:NO];
controller = nil; // ?
[self performSegueWithIdentifier:@"ShowTimer" sender:self];
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([[segue identifier] isEqualToString:@"ShowTimer"])
{
TimerViewController * timerViewController = (TimerViewController *)[segue destinationViewController];
[timerViewController setDelegate:self];
}
TimerViewController.m
-(void) swipe:(id)selector {
// swipe left
stop = YES; // ivar for ^after to not call [self animate]
[self.delegate timerViewControllerDidSwipe:self];
}
-(void) animate {
// anim block here..
void (^after) (BOOL) = ^(BOOL f) {
if (duration % 60 == 0 && duration >= 60) {
if (minutesAlt.center.y < minutes.center.y)
{
CGPoint a = minutes.center;
a.y -= 2 * displacement;
minutes.center = a;
minutes.text = [NSString stringWithFormat:@"%02d", (duration / 60) -1];
}
else
{
CGPoint a = minutesAlt.center;
a.y -= 2 * displacement;
minutesAlt.center = a;
minutesAlt.text = [NSString stringWithFormat:@"%02d", (duration / 60) -1];
}
}
if (duration == 0)
{
// end
}
else if (secondsAlt.center.y < seconds.center.y)
{
CGPoint a = seconds.center;
a.y -= 2 * displacement;
seconds.center = a;
duration--;
seconds.text = [NSString stringWithFormat:@"%02d",duration % 60];
if (!stop) {[self animate];}
}
else
{
CGPoint a = secondsAlt.center;
a.y -= 2 * displacement;
duration--;
secondsAlt.center = a;
secondsAlt.text = [NSString stringWithFormat:@"%02d", duration % 60];
if (!stop) {[self animate];}
}
};
[UIView animateWithDuration:0.50
delay:0.50
options:UIViewAnimationOptionCurveLinear
animations:anim
completion:after];
}
非常感谢任何帮助。