2012-09-04 27 views
7

Bueno, todo el mundo sabe que en ObjC tenemos¿Cómo pasar argumentos a NSAction?

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

en cuenta que completion bloque tiene un argumento BOOL. Ahora vamos a ver MonoTouch:

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

NSAction es:

public delegate void NSAction(); 

Sólo el delegado sin ningún argumento. Por otra parte, en "internos" MonoTouch podemos ver:

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(); 
     } 
    }); 
} 

Aviso delegate (bool x), se llama a la función al igual que necesito. Ahora, ¿cómo puedo pasar Action<bool> como finalización al UIView.Animate?

Respuesta

8

Esa era una vieja fallo de unión (tipo incorrecto) y, por razones de compatibilidad, Animate todavía utilizan un controlador NSAction finalización.

Para solucionar este problema, se agregó un nuevo método AnimateNotify a MonoTouch. Esta versión aceptar una UICompletionHandler que se define así:

public delegate void UICompletionHandler (bool finished); 

Así que la solución a su problema es el uso de la nueva API AnimateNotify.

+0

¿No cree que es hora de quitar la envoltura de edad? –

+0

@Maxim: imagino que sería excesivo eliminarlo durante la noche. Pero obsoleto me parece una buena idea. (No soy un desarrollador de MT, solo un usuario). –

5

Así que debe verse como:

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

}, delegate (bool finished) { 

}); 

O con la sintaxis lambda:

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

}, (finished) => { 

}); 
Cuestiones relacionadas