如何将参数传递给NSAction?

fol*_*lex 7 c# uikit xamarin.ios uiviewanimation ios

好吧,每个人都知道在ObjC我们有

+ (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion
Run Code Online (Sandbox Code Playgroud)

请注意,completion块具有BOOL参数.现在让我们来看看Monotouch:

public static void Animate (double duration, double delay, UIViewAnimationOptions options, NSAction animation, NSAction completion)
Run Code Online (Sandbox Code Playgroud)

NSAction是:

public delegate void NSAction ();
Run Code Online (Sandbox Code Playgroud)

只是没有任何争论的代表.此外,在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 ();
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

注意delegate (bool x),它就像我需要的那样调用函数.现在,我如何通过Action<bool>完成UIView.Animate

pou*_*pou 8

这是一个旧的绑定错误(错误的类型),并且出于兼容性原因,Animate仍然使用NSAction完成处理程序.

为了解决这个问题AnimateNotify,MonoTouch添加了一种新方法.这个版本接受一个UICompletionHandler定义如下:

public delegate void UICompletionHandler (bool finished);
Run Code Online (Sandbox Code Playgroud)

因此,您的问题的解决方案是使用较新的AnimateNotifyAPI.


sup*_*cal 5

所以这应该是这样的:

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

}, delegate (bool finished) {

});
Run Code Online (Sandbox Code Playgroud)

或者使用lambda语法:

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

}, (finished) => {

});
Run Code Online (Sandbox Code Playgroud)