7

まあ、誰もがObjCで私たちが持っていることを知っています

+ (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion

completionブロックにBOOL引数があることに注意してください。それでは、Monotouchを見てみましょう。

public static void Animate (double duration, double delay, UIViewAnimationOptions options, NSAction animation, NSAction completion)

NSActionは次のとおりです。

public delegate void NSAction ();

引数なしの代理人だけ。さらに、Monotouchの「内部」では次のことがわかります。

public static void Animate (double duration, double delay, UIViewAnimationOptions options, 
NSAction animation, NSAction completion)
{
    UIView.AnimateNotify (duration, delay, options, animation, delegate (bool x)
    {
        if (completion != null)
        {
            completion ();
        }
    });
}

注意してくださいdelegate (bool x)、それは私が必要とするのと同じように関数を呼び出します。さて、どうすればAction<bool>完了として渡すことができUIView.Animateますか?

4

2 に答える 2

8

これは古いバインディングバグ(間違ったタイプ)であり、互換性の理由から、Animate引き続きNSAction完了ハンドラーを使用します。

これを修正するためAnimateNotifyに、MonoTouchに新しいメソッドが追加されました。このバージョンは、UICompletionHandler次のように定義されたを受け入れます。

public delegate void UICompletionHandler (bool finished);

したがって、問題の解決策は、新しいAnimateNotifyAPIを使用することです。

于 2012-09-04T16:05:35.140 に答える
5

したがって、次のようになります。

UIView.AnimateNotify(duration, 0, UIViewAnimationOptions.CurveEaseInOut, delegate () {

}, delegate (bool finished) {

});

またはラムダ構文を使用する場合:

UIView.AnimateNotify(duration, 0, UIViewAnimationOptions.CurveEaseInOut, () => {

}, (finished) => {

});
于 2013-01-29T07:43:09.803 に答える