アップデート
ViewControllerは破棄されず、新しいViewControllerは作成されません。これ:
TimerViewController * timerViewController = (TimerViewController *)[segue destinationViewController];
新しいインスタンスは作成されません。しかし、これは
TimerViewController *timerViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"theID"];
します。そのため、新しいインスタンスが現在使用されていますが、同じ問題があります。
更新を終了
分と秒がスムーズにアニメーション化され、数字のホイールの回転をエミュレートするシンプルな「アナログデジタルタイマー」があります。これは単に時間のリストを持つParentViewControllerであり、時間を選択するとTimerViewControllerへのセグエが実行されます。TimerViewControllerは、再帰的なUIViewアニメーションを使用して、時計のカウントダウンをシミュレートします。これはうまく機能します。
ユーザーがリスト内の次のタイマーに移行できるようにするには、ParentViewControllerに戻って選択する必要はありません。これはうまく機能しません。
私は多くのバリエーションを試しましたが、基本的なパターンは、TimerViewControllerがデリゲート(ParentViewController)にそれをポップするように要求し、次に時間のリストから次回を使用してTimerViewControllerに再度シークすることです。最初のアニメーションが終了することはなく、最初のTimerViewControllerインスタンスが「死ぬ」ことはありません。新しいインスタンスだと思ったものを使用して2回目に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];
}
どんな助けでも大歓迎です。