2015-11-30 1 views
0

J'ai édité du code basé sur ce que d'autres ont indiqué, mais je continue à recevoir l'erreur indiquée ci-dessus, en disant que j'ai envoyé un "sélecteur non reconnu". Le sélecteur de mon timer, à l'origine l'erreur, a été modifié, mais Xcode se plaint toujours.Sélecteur non reconnu ... bug?

Voici mon code:

import UIKit 

class ViewController: UIViewController { 

@IBOutlet var instructionsNew: UILabel! 

@IBOutlet var lockStatusNew: UIImageView! 

@IBOutlet var timerText: UILabel! 



@IBAction func hackLockButton(sender: AnyObject){ 

    var counter = 0 





let timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self,  selector: "updateCounter", userInfo: nil, repeats: true) 
func updateCounter() { 
     timerText.text = String(counter++) 
    } 

    while(timerText.text == "1") {instructionsNew.text = "loading"} 

    while(timerText.text == "2"){instructionsNew.text = "loading."} 

    while(timerText.text == "3") {instructionsNew.text = "loading.."} 

    while(timerText.text == "4"){instructionsNew.text = "loading..."} 

    while(timerText.text == "5") {instructionsNew.text = "hack successful!" 
     lockStatusNew.image = UIImage(named: "unlocked.png") 
     timer.invalidate() 

    } 

} 



override func viewDidLoad() { 

    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 


} 

S'il vous plaît me aider à repérer le problème. Merci!

+1

non, la fonction 'updateCounter' ne prend aucun paramètre. Il n'y a pas besoin d'ajouter ':' –

+0

Pourrait avoir juré que jamais utilisé dans les versions antérieures de swift. @setonugroho bon appel. – sbarow

Répondre

1

Le problème est que vous avez ajouté le updateCounter à l'intérieur de la fonction hackLockButton. Vous devez placer la méthode en dehors de cette fonction et cela fonctionnera.

@IBAction func hackLockButton(sender: AnyObject) 
{ 
    // Code here 
} 

func updateCounter() 
{ 
    timerText.text = String(counter++) 
} 

Suggestion:

Vous ne voulez pas écrire while(timerText.text == "1") {instructionsNew.text = "loading"} pour montrer cette étiquette. Cela peut provoquer une boucle infinie et bloquer votre interface utilisateur. Au lieu de cela, utilisez un boîtier de commutateur comme:

switch(counter) 
{ 
    case 1: instructionsNew.text = "loading" 
    // Write other cases too 
} 
+0

Si je fais cela, Xcode se plaindra qu'il y a un "compteur d'identificateur non résolu '". –

+0

@MintonLee: Déclarez le compteur en tant que variable de niveau classe au lieu de le déclarer dans la méthode 'hackLockButton' –

+0

Vous pouvez également déplacer la déclaration du compteur dans la fonction updateCounter. Si vous n'utilisez pas de variable de compteur sauf dans la fonction updateCounter, mieux vaut la déclarer ici. –

1

Je pense que vous avez vraiment, vraiment besoin de comprendre comment fonctionne une minuterie.

Votre application a une boucle d'exécution. Lorsque l'utilisateur fait quoi que ce soit, la boucle d'exécution appelle le code approprié dans votre programme, exécute le code et finit lorsque ce code est exécuté. Par exemple, lorsque vous appuyez sur un bouton, la boucle d'exécution appelle la fonction de rappel de bouton, attend que le bouton se termine et peut attendre que la prochaine chose se produise.

Une temporisation planifiée insère des appels dans cette boucle d'exécution. Donc, chaque seconde, la boucle d'exécution appelle updateCounter. updateCounter devrait faire quelques choses, puis revenir. Il n'est pas censé attendre dans une boucle while du tout. Le temps() à l'intérieur est mal, très mal.

Vous faites également d'autres choses à l'envers. Vous utilisez votre étiquette timerText pour contrôler les choses. C'est faux. L'étiquette devrait afficher choses. Le updateCounter peut mettre à jour le compteur, mais toutes les autres actions doivent dépendre de la valeur du compteur et non de la valeur d'une étiquette d'interface utilisateur! Imaginez que votre patron vous dise d'afficher non pas 1, 2, 3, 4, 5 mais un, deux, trois, quatre, cinq. Vous changez évidemment ce qui entre dans l'étiquette. Mais avec votre code, vous devez changer le code partout où vous lisez le texte de l'étiquette. Maintenant, imaginez que vous ne voulez pas un, deux, trois, mais le bon texte dans la langue de l'utilisateur ...