我正在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退出。
我看过很多不同的答案和例子,我看不出我做错了什么。
我使用xcode 6.1在iOS模拟器上运行这个。
这是最新消息。多亏了第一个答案中提供的建议和代码,我有了一些工作。然而,我的代码看起来是一样的,却不起作用。为了在一个更大的项目中实现,我想知道如何避免我看到的错误。例如,这是有效的:
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()
}
}
不要使用:initTimerFired,改为其他类似:handleTimer,
init作为函数名的前缀可能会混淆Xcode
请参见此处:https://developer.apple.com/library/ios/documentation/swift/conceptual/buildingcocoaapps/InteractingWithObjective-CAPIs.html
你必须这样做:
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()
}
}