2014-11-23 17 views
7

Sto provando a sviluppare un'applicazione che include una funzione di cronometro semplice. Sto usando Xcode 6 e la lingua Swift. Ecco il codice in FirstViewControllerSelettore non riconosciuto inviato all'istanza NSTimer Swift

@IBAction func Stopwatch (Sender:UIButton) { 

var startTime = NSTimeInterval() 

    func updateTime(timer:NSTimer) { 

     //Find Current TIme 

     var currentTime = NSDate.timeIntervalSinceReferenceDate() 

     //Find the difference between current time and start time 

     var elapsedTime :NSTimeInterval = currentTime - startTime 

     //calculate the minutes in elapsed time. 
     let minutes = UInt(elapsedTime/60.0) 
     elapsedTime -= (NSTimeInterval(minutes) * 60) 

     //calculate the seconds in elapsed time. 
     let seconds = UInt(elapsedTime) 
     elapsedTime -= NSTimeInterval(seconds) 

     //find out the fraction of milliseconds to be displayed. 
     let hours = UInt(elapsedTime * 100) 

     let strMinutes = minutes > 9 ? String(minutes):String(minutes) 
     let strSeconds = seconds > 9 ? String(seconds):String(seconds) 
     let strHours = hours > 9 ? String(hours):String(hours) 

     //assign text to Label 
     elapsedTimeLabel.text = "You have slept for \(strHours)" 
    } 

    //Timer 
    var timer = NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: Selector("updateTime:"), userInfo: nil, repeats: true) 
    startTime = NSDate.timeIntervalSinceReferenceDate() 

} 
} 

Ogni volta che faccio funzionare l'applicazione (nel simulatore iOS), l'applicazione si blocca quando si preme il pulsante (eseguire la funzione cronometro). L'errore legge sempre

2014-11-23 11:44:53.617 Sleep[9630:644637] -[Sleep.FirstViewController updateTime:]: 
unrecognized selector sent to instance 0x7ff6d9676e80 
2014-11-23 11:44:53.622 Sleep[9630:644637] *** Terminating app due to uncaught exception 
'NSInvalidArgumentException', reason: '-[Sleep.FirstViewController updateTime:]: unrecognized 
selector sent to instance 0x7ff6d9676e80' 
*** First throw call stack: 

Non ho idea perché questo sta accadendo e sono abbastanza nuovo di programmazione iOS, quindi per favore aiuto!

risposta

0

È stata definita la updateTime come funzione locale su Stopwatch, quindi non è disponibile al di fuori del suo ambito. Dovresti spostarlo a livello di classe (uguale a Stopwatch) per essere accessibile.

Noto tuttavia che ci sono alcune variabili locali che dovrebbero probabilmente essere proprietà di istanza.

14

lasciare updateTime essere un metodo di classe.
E se è in una classe Swift pura è necessario premettere che la dichiarazione di metodo con @objc come:

class A { 
    @objc func updateTime(timer:NSTimer) { 

    } 
} 
+2

Il flag @objc non sembra essere necessario, almeno a partire da Swift 1.2. Tuttavia, mi sono imbattuto nello stesso errore perché la mia firma del selettore era sbagliata. Deve essere configurato per ricevere un NSTimer. per esempio. 'func mySelector (timer: NSTimer)' –

0

Altra possibilità: assicurarsi che la funzione di selezione non lo fa throw, come che vi darà anche un'eccezione selettore non riconosciuto:

func mySelector(timer: NSTimer) throws { 
} 
Problemi correlati