2011-03-06 8 views
10

Deseo invocar setEditing:animated: en una vista de tabla con un ligero retraso. Normalmente, usaría performSelector:withObject:afterDelay: peroUso de performSelector: withObject: afterDelay: con parámetros que no son objetos

  1. pSwOaD sólo acepta un parámetro
  2. el segundo parámetro a setEditing:animated: es una primitiva BOOL - no un objeto

En el pasado me gustaría crear un método ficticio en mi propia clase, como setTableAnimated y luego llamar al [self performSelector:@selector(setTableAnimated) withObject:nil afterDelay:0.1f, pero eso me parece kludgy.

¿Hay una mejor manera de hacerlo?

Respuesta

19

¿Por qué no utilizar un dispatch_queue?

double delayInSeconds = 2.0; 
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
     [tableView setEditing …]; 
    }); 
+0

No sé por qué se votó negativamente, parece una buena solución para mí. –

+0

¡esta es una gran respuesta! –

+0

Porque requiere iOS 4 – Bill

1

El selector setEditing:animated: no es compatible con performSelector:withObject:afterDelay. Solo puede llamar a métodos con 0 o 1 argumentos y el argumento (si lo hay) DEBE ser un objeto. Por lo tanto, su solución es el camino a seguir. Puede envolver el valor BOOL en un objeto NSValue y pasarlo a su método setTableAnimated.

16

Es necesario utilizar NSInvocation:

ver este código, tomado de esta answer, y he cambiado un poco para que coincida con su pregunta:

BOOL yes = YES; 
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:[self.tableView methodSignatureForSelector:@selector(setEditing:Animated:)]]; 
[inv setSelector:@selector(setEditing:Animated:)]; 
[inv setTarget:self.tableView]; 
[inv setArgument:&yes atIndex:2]; //this is the editing BOOL (0 and 1 are explained in the link above) 
[inv setArgument:&yes atIndex:3]; //this is the animated BOOL 
[inv performSelector:@selector(invoke) withObject:nil afterDelay:0.1f]; 
+0

Creo que el uso de un nombre como 'var _Sí BOOL = YES' es un poco más claro, ya que alivia un poco de confusión en cuanto a si usted tiene un error tipográfico (sí vs SI). – gabrielk

+0

También quería señalar que la razón para usar una variable para 'YES' en lugar de simplemente pasar el bool directamente:' NSInvocation' arroja una excepción: '[NSInvocation setArgument: atIndex:]: NULL address argument', [explicado en esta respuesta] (http://stackoverflow.com/a/11061349/146517). – gabrielk

0

Si usted puede conseguir su cabeza alrededor de ella , utilice un capturador NSInvocation para hacer un objeto de invocación & llámelo con un retraso con 1 línea en lugar de muchos: http://overooped.com/post/913725384/nsinvocation

+0

Difícilmente una línea si se trata de crear una clase. –

Cuestiones relacionadas