1

アニメーションブロックを含むメソッドで値を返そうとしています。私が以下に持っているコードは完全にうまく機能しますが、それを行うためのより良いまたはよりクリーンな方法があるはずです。これを行うためのより良い方法はありますか?

 + (BOOL) flipImageAndTextForView:(UIView *) viewFlipImageAndText IsImageDisplayed:(BOOL) imageFlipDisplayed  flipTextView:(UITextView *) textViewDonate flipImage: (UIImageView *)pictureImage{

            __block BOOL tempBool;

        [UIView transitionWithView:viewFlipImageAndText
                          duration:0.3f
                           options:UIViewAnimationOptionTransitionFlipFromLeft
                        animations:^(void) {
                            if (imageFlipDisplayed)
                            {
                                [viewFlipImageAndText bringSubviewToFront:textViewDonate];
                                tempBool = FALSE;
                            }
                            else
                            {
                                [viewFlipImageAndText bringSubviewToFront:pictureImage];
                                tempBool = TRUE;                            
                            }
                        }
                        completion:^(BOOL finished) {
                            NSLog(@"Done!");
                        }];

        if(tempBool)
        {
            return TRUE;
        }
        else{
            return FALSE;
        }

    }
4

2 に答える 2

2

メソッドが戻る前にtempBoolが正しく設定されることを保証できないため、コードには競合状態がありflipImageAndTextForView:...ます。transitionWithView:duration:options:animations:completion:ブロックしません。いずれにせよ、次の行:

    if(tempBool)
    {
        return TRUE;
    }
    else{
        return FALSE;
    }

次のように置き換える必要があります。

    return tempBool;

それが2番目の方法ではなく、あなたが書いた方法で機能する場合、それはここでの固有の競合状態の単なる別の症状です。

最善の方法は、コードをこのように構造化しないことです。アニメーションブロックの外側で完全にテストするかimageFlipDisplayed、の完了ブロックを使用してtransitionWithView:duration:options:animations:completion:、アニメーションの完了時に必要な情報を含むメッセージを別の場所に送信します。

于 2012-09-07T00:32:31.360 に答える
0

問題は、アニメーションの開始時にのみ値が設定されることです。これは、おそらくrunLoopの次の反復です。UIViewアニメーション呼び出しの前に同じテキストを作成することもできますが、これは合理的な方法のように思われます。または、完了ブロックメッセージを何かに戻すこともできます。

于 2012-09-07T00:26:14.473 に答える