我在ViewController中创建了一个计时器。在它触发一次之后,该程序将不再响应任何进一步的UI事件。
我在ViewDidLoad()
内创建了计时器:
NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "initTimerFired", userInfo: nil, repeats: false)
带有计时器功能(定义为ViewController的方法):
func initTimerFired(){
println("Timer fired")
}
它成功触发,但此后程序挂起并且不响应UI事件。如果我设置repeat = true
,那么在退出EXC_BAD_ACCESS之前它会运行几次。
我看了很多不同的答案和例子,我看不出自己做错了什么。
我在iOS模拟器上使用xcode 6.1运行它。
这是一个更新。感谢第一个答案中提供的建议和代码,我有一些工作。但是,我看起来相同的代码不起作用。为了在更大的项目的上下文中实现事物,我想知道如何避免我看到的错误。例如,这有效:
class ViewController: UIViewController {
@IBOutlet weak var strConsole: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
initTaskManager()
}
func initTaskManager(){
let taskManager = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "updateTask", userInfo: nil, repeats: true)
}
func updateTask(){
self.strConsole.text = "\(strConsole.text!)Abc"
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
但是这个版本没有。只有功能名称已更改!:
class ViewController: UIViewController {
@IBOutlet weak var strConsole: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
initTimer()
}
func initTimer(){
let timer1 = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "initTimerFired", userInfo: nil, repeats: true)
}
func initTimerFired(){
self.strConsole.text = "\(strConsole.text!)Abc"
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
答案 0 :(得分:3)
不要使用:initTimerFired,更改为其他内容,例如:handleTimer,
init作为函数名的前缀可能会混淆Xcode
答案 1 :(得分:1)
你必须这样做:
import UIKit
import AVFoundation
class ViewController: UIViewController {
@IBOutlet weak var strConsole: UILabel!
func startTaskManager(){
let taskManager = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "updateTask", userInfo: nil, repeats: true)
}
func updateTask(){
self.strConsole.text = "\(strConsole.text!)Abc"
}
override func viewDidLoad() {
super.viewDidLoad()
startTaskManager()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}