Así que me voy a crear una aplicación/juego donde usted presiona un botón que corresponde a una imagen antes de que se acabe el tiempo y usted pierde. Usted recibe 1 segundo para que presiona el botón, y si elige el botón de la derecha, a continuación, el temporizador se restablece y una nueva imagen. Estoy teniendo problemas para restablecer el temporizador. Se activa después de un segundo, incluso después de que el intento de restablecer. Aquí está el código:

loadPicture() se ejecuta fuera de viewDidLoad()

func loadPicture() {
    //check if repeat picture
    secondInt = randomInt
    randomInt = Int(arc4random_uniform(24))
    if secondInt != randomInt {
        pictureName = String(self.PicList[randomInt])
        image = UIImage(named: pictureName)
        self.picture.image = image
        timer.invalidate()
        resetTimer()

    }
    else{
        loadPicture()
    }
}

y aquí está el resetTimer() método:

func resetTimer(){
        timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: Selector("gameOverTimer"), userInfo: nil, repeats: false)

}

Creo que puede tener algo que ver con NSRunloops? No estoy seguro. Yo no sé ni lo que es un NSRunloop es ser honesto.

No estoy seguro de por qué el temporizador está en marcha después de que la invalida, pero tiene un error en su recursividad que cheques duplicados – sobrescribir randomInt de modo que en la llamada recursiva a loadPicture que son efectivamente comprobar si este número aleatorio es el mismo que el anterior número aleatorio, no se si este número aleatorio es la misma que la anterior imagen que se muestra
en loadPicture() antes de resetTimer() de la línea de escritura temporizador = nil . . .
A sólo asegúrese de que, se va a crear el temporizador en el mismo hilo? segundo, intenta aumentar el tiempo de espera de 5 segundos?
Paulw11, no Hay ningún error. El randomInt representa el índice de la imagen en la matriz. Si la int es el mismo, la imagen es la misma.
iHart, que no funciona 🙁

OriginalEl autor Luke Patterson | 2015-07-29

1 Comentario

  1. 14

    Así que finalmente lo entendí…

    Tuve que hacer una función para iniciar el temporizador, mediante la inicialización.
    Y en el resetTimer() función que he añadido el temporizador.invalidate() de la línea. Así que mi código es este:

    func loadPicture() {
        //check if repeat picture
        secondInt = randomInt
        randomInt = Int(arc4random_uniform(24))
        if secondInt != randomInt {
            pictureName = String(self.PicList[randomInt])
            image = UIImage(named: pictureName)
            self.picture.image = image
            resetTimer()
    
        }
        else{
            loadPicture()
        }
    }
    func startTimer(){
        timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: Selector("gameOverTimer"), userInfo: "timer", repeats: true)
    }
    
    func resetTimer(){
    
        timer.invalidate()
        startTimer()
    }

    EDITAR

    Con el nuevo selector de sintaxis se parece a esto:

    func startTimer(){
        timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: #selector(NameOfClass.startTimer), userInfo: "timer", repeats: true)
    }
    NSTimer.scheduledTimerWithTimeInterval me va a dar vuelta una nueva instancia de NSTimer, ¿verdad ? Hay alguna manera de restablecer el Temporizador, como, en la misma instancia de Timer ?
    no, no lo creo. Usted puede invalidarlo, pero si usted hace que usted no puede iniciar la copia de seguridad de nuevo. @Que20

    OriginalEl autor Luke Patterson

Dejar respuesta

Please enter your comment!
Please enter your name here