El MonoTouch docs indican que método asigna al selector Obj-C performSelector:withObject:afterDelay
, que sólo admite la invocación de un selector con un solo argumento.
La mejor manera de manejar esto depende de lo que necesite hacer. Una forma típica de manejar esto sería colocar los argumentos como propiedades/campos en un único objeto NSO, luego el objetivo se modificaría para tener un único argumento, y extraer los argumentos reales de ese método. Si hiciera esto con un objeto MonoTouch personalizado, tendría que tener cuidado con el GC que recopila el par administrado, si nada en el código administrado guardara una referencia al mismo.
Una mejor solución dependerá exactamente de cómo la utilice. Por ejemplo, en su ejemplo, puede llamar trivialmente al método C# directamente, p.
_HandleSaveButtonTouchUpInside (url, data);
Si tiene que enviar a través de Obj-C, por alguna razón, pero no es necesario el retraso, utilice MonoTouch.ObjCRuntime.Messaging, por ejemplo,
MonoTouch.ObjCRuntime.Messaging.void_objc_msgSend_IntPtr_IntPtr (
target.Handle,
MonoTouch.ObjCRuntime.Selector.GetHandle ("_HandleSaveButtonTouchUpInside"),
arg0.Handle,
arg1.Handle);
Si necesita el retraso, se puede usar un NSTimer. MonoTouch ha agregado soporte especial para esto para usar un delegado NSAction, por lo que puede usar un lambda C# para capturar argumentos de manera segura.
NSTimer.CreateScheduledTimer (someTimespan,() => _HandleSaveButtonTouchUpInside (url, data));
Gracias por la minuciosa respuesta mhutch. He estado usando PerformSelector cuando necesitaba liberar el hilo principal para que Cocoa redibujara la pantalla, y luego pude volver a procesar algo de lógica. En este momento estoy tratando de actualizar el equivalente de una barra de progreso que se ha dibujado en la pantalla durante un writeStream para el ciclo que tengo. Quería ver si esencialmente podía actualizar la pantalla colocando un selector de rendimiento dentro del ciclo for y actualizando la propiedad de la barra de progreso. –
Otra forma de hacerlo sería usar un hilo para la lógica/secuencia, y usar InvokeOnMainThread del hilo para actualizar la UI. –
Esto me salvó de tener que volver a vincular manualmente una biblioteca porque el desarrollador original no enlazó una propiedad en particular, o liberar la fuente, así que gracias. Para cualquier persona interesada, las propiedades se pueden establecer fácilmente usando el método msgSend_IntPtr_IntPtr llamando a setColor: donde color es el nombre de la propiedad. (Arg 0 es el valor de la propiedad, Arg 1 = IntPtr.Zero) – Dermot