2015-07-29 13 views
8

Stworzyłem aplikację/grę, w której dotykasz przycisku odpowiadającego obrazowi, zanim skończy się czas i przegrasz. Dostaniesz 1 sekundę, aby dotknąć przycisku, a jeśli wybierzesz odpowiedni przycisk, timer zresetuje się i pojawi się nowy obraz. Mam problem z ponownym włączeniem timera. Wystrzeliwuje się po jednej sekundzie, nawet po próbie jej zresetowania. Oto kod:Jak zresetować NSTimer? kod swift

loadPicture() ucieka 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() 
    } 
} 

i tu jest() metoda resetTimer:

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

} 

myślę, że może to mieć coś wspólnego z NSRunloops? Nie jestem pewny. Nawet nie wiem, co to NSRunloop ma być szczery.

+0

Nie jestem pewien, dlaczego twój zegar jest wypalanie po unieważnić go , ale masz błąd w rekurencji, który sprawdza duplikaty - Nadpisujesz 'randomInt', aby w rekursywnym wywołaniu' loadPicture' skutecznie sprawdzałeś, czy ta losowa liczba jest taka sama jak poprzednia losowa liczba, a nie jeśli losowa liczba to s ame jak poprzednie zdjęcie, które zostało wyświetlone – Paulw11

+0

w loadPicture() przed resetTimerTimer() zapis linii timer = nil. . . – iHart

+0

Aby się upewnić, czy tworzysz timer w tym samym wątku? po drugie, czy próbowałeś zwiększyć czas, żeby powiedzieć 5 sekund? – Shripada

Odpowiedz

11

więc w końcu zorientowaliśmy się ...

musiałem zrobić oddzielną funkcję, aby uruchomić stoper przez inicjalizacji. I w funkcji resetTimer() dodałem linię timer.invalidate(). Więc mój kod wygląda następująco:

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

EDIT

Dzięki nowej selektora składnia wygląda tak:

func startTimer(){ 
    timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: #selector(NameOfClass.startTimer), userInfo: "timer", repeats: true) 
} 
+0

'NSTimer.scheduledTimerWithTimeInterval' dostarczy mi nowe wystąpienie NSTimer, prawda? Czy istnieje sposób na zresetowanie licznika czasu, np. Tej samej instancji Timera ? – Que20

+0

nie, nie wierzę w to, możesz je unieważnić, ale jeśli to zrobisz, nie będziesz mógł go ponownie uruchomić @ Que20 –