2012-09-04 21 views
7

Ebbene, tutti sanno che in objC abbiamoCome passare argomenti a NSAction?

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

noti che completion blocco ha un argomento BOOL. Ora diamo un'occhiata a MonoTouch:

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

NSAction è:

public delegate void NSAction(); 

Proprio il delegato senza argomenti. Inoltre, in MonoTouch "internals" possiamo vedere:

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

Avviso delegate (bool x), si chiama la funzione, proprio come ho bisogno. Ora, come posso passare Action<bool> come completamento a UIView.Animate?

risposta

8

Questo era un vecchio vincolante bug (tipo sbagliato) e, per motivi di compatibilità, Animate usano ancora un gestore NSAction completamento.

Per risolvere questo problema, è stato aggiunto a MonoTouch un nuovo metodo AnimateNotify. Questa versione accettare una UICompletionHandler che è definito in questo modo:

public delegate void UICompletionHandler (bool finished); 

Quindi la soluzione al vostro problema è quello di utilizzare il più recente AnimateNotify API.

+0

Non pensi che è il momento di rimuovere il vecchio involucro? –

+0

@Maxim: Immagino che sarebbe eccessivo per rimuoverlo durante la notte. Ma obsoleto mi sembra una buona idea. (Non sono uno sviluppatore MT, solo un utente.) –

5

Così che dovrebbe essere simile:

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

}, delegate (bool finished) { 

}); 

O con la sintassi lambda:

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

}, (finished) => { 

}); 
Problemi correlati