1

アップデート

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];
}

どんな助けでも大歓迎です。

4

1 に答える 1

0

関連する質問でここを修正しました。これは単純な構文エラーでした(見つけるのに数週間かかりました)。

于 2012-10-26T19:37:06.993 に答える