我根据其他人的指示编辑了一些代码,但我不断收到上述错误,说我发送了一个"无法识别的选择器"。我的计时器的选择器,原来是错误,已被修改,但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.
}
}
请帮我发现问题。谢谢!
答案 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,而是显示一,二,三,四,五。你显然会改变标签中的内容。但是使用您的代码,您必须在读取标签文本的任何地方更改代码。现在想象一下,你不想要用户语言中的一,二,三个正确的文字...