无法识别的选择器......错误?

时间:2015-11-30 11:46:50

标签: ios xcode swift

我根据其他人的指示编辑了一些代码,但我不断收到上述错误,说我发送了一个"无法识别的选择器"。我的计时器的选择器,原来是错误,已被修改,但Xcode仍在抱怨。

这是我的代码:

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.
}


}

请帮我发现问题。谢谢!

2 个答案:

答案 0 :(得分:1)

问题是,您在updateCounter函数中添加了hackLockButton。 您应该将该方法放在该函数之外,它将起作用。

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

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

<强>建议:

您不想写while(timerText.text == "1") {instructionsNew.text = "loading"}来显示该标签。它可能会导致无限循环并挂起您的UI。而是使用像:

这样的开关案例
switch(counter)
{
  case 1: instructionsNew.text = "loading"
  // Write other cases too
}

答案 1 :(得分:1)

我认为你真的,真的需要了解计时器的工作原理。

您的应用程序有一个运行循环。当用户执行任何操作时,运行循环将调用程序中的相应代码,运行代码,并在运行该代码时完成。例如,当您点击一个按钮时,运行循环将调用您的按钮回调函数,等待它完成,然后它可以等待下一件事发生。

计划的计时器将调用插入到该运行循环中。所以每一秒运行循环调用updateCounter。 updateCounter应该做一些事情,然后返回。它不应该在所有的while循环中等待。里面的while()严重错误。

你还做了一些颠倒的事情。您可以使用timerText标签来控制事物。那是错的。标签应该显示的东西。 updateCounter可以更新计数器,但是所有其他操作应该取决于计数器的值,而不是取决于用户界面标签的值!想象一下,你的老板告诉你不要显示1,2,3,4,5,而是显示一,二,三,四,五。你显然会改变标签中的内容。但是使用您的代码,您必须在读取标签文本的任何地方更改代码。现在想象一下,你不想要用户语言中的一,二,三个正确的文字...