He hecho un RunLoop con un temporizador que se actualiza una etiqueta que muestra una cuenta atrás. Necesito el RunLoop para detener una vez que la cuenta atrás llegue a cero, para el caso de que el temporizador termina normalmente yo sólo podría utilizar runUntilDate, con la fecha de la fecha actual + el tiempo de la cuenta atrás. El problema es cuando el usuario cancela la cuenta atrás desde un botón antes de que se agote. No sé cómo decirle a la RunLoop a detener en el botón cancelar la acción. Aquí está el código para el RunLoop:

    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:
                            [self methodSignatureForSelector:@selector(updateCountdownLabel:)]];
[invocation setTarget:self];
[invocation setSelector:@selector(updateCountdownLabel:)];
[[NSRunLoop mainRunLoop] addTimer:[NSTimer timerWithTimeInterval:1 invocation:invocation repeats:YES] forMode:NSRunLoopCommonModes];

El método sólo indica la etiqueta para reducir en 1 en cada bucle.

Podría decir el botón cancelar para cambiar la etiqueta a cero, y tiene la carrera de bucle selector de comprobar si el valor es cero, pero, ¿podría el RunLoop propio selector de decirle que deje?

cancelPerformSelector:target:argument:

cancelPerformSelectorsWithTarget:

Estos son lo más cercano que he encontrado, pero no parecen trabajar desde el interior de la RunLoops propio selector, o al menos no de una manera que yo he probado.

Básicamente necesito tener el botón de decirle a la RunLoop para detener, o de alguna manera detener el RunLoop de su propio selector.

Gracias.

Un selector es simplemente el nombre de un método. He corregido tu usos de la palabra en mi edición.

OriginalEl autor Elbimio | 2011-07-08

1 Comentario

  1. 13

    Usted no ha hecho una carrera bucle, se ha programado un temporizador para que comience el principal ejecutar el bucle.

    Lo que usted debe hacer es guardar el NSTimer objeto que se crea como una variable de instancia antes de programar el temporizador en la ejecución del bucle.

    En su updateCountdownLabel: método, una vez que su condición ha sido satisfecha simplemente llame a -invalidate en su instancia de timer. Esto eliminará el temporizador de la ejecución del bucle, y porque nunca se conservaron, que se dará a conocer.

    He actualizado los métodos a utilizar un selector basado en NSTimer en lugar de su NSInvocation. Esto significa que el método de devolución de llamada de la firma se define como usted está esperando. También evita la necesidad de almacenar la NSTimer objeto en un ivar:

    - (void)startCountDown
    {
    
        NSTimer* timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(updateCountdownLabel:) userInfo:nil repeats:YES]
        [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
    }
    
    
    - (void)updateCountdownLabel:(NSTImer*)timer
    {
        if(thingsAreAllDone)
        {
            [timer invalidate];
        }
    }
    Que no parece ser de trabajo, donde se utiliza «(id)anArg», lo que en realidad debería ir allí? Siempre pongo el temporizador. En este caso, que tengo «- (void) updateCountdownLabel:(NSTimer *) temporizador», nunca traté de hacer algo diferente antes, pero cuando lo hago como he mencionado, siempre que puedo usar el temporizador variable me sale un aviso de «Local de la declaración de temporizador se esconde variable de instancia». Para la declaración si estoy comprobando si la etiqueta es menor o igual a cero. Este código no tiro un error, pero no se detiene la etiqueta de la cuenta regresiva para los negativos. Alguna idea?
    He actualizado el código para utilizar un selector basado en NSTimer, que debe dar el resultado que usted desea.
    Encuentra el problema. Sólo necesitaba una variable para guardar el número en la etiqueta como un int y, a continuación, utilizar en la si. Gracias!
    Esto solo funciona cuando se dispara «updateCountdownLabel» la primera vez y de inmediato llame a invalidar en el temporizador. Si se ha disparado «updateCountdownLabel» varias veces y que decide anular el temporizador, que no va a quitar de la NSRunLoop o NSRunLoop tiene otra fuente de entrada detrás de la escena.

    OriginalEl autor Rob Keniger

Dejar respuesta

Please enter your comment!
Please enter your name here