swift - 尝试使用委托更新 UILabel
swift - trying to update UILabel with delegate
我正在尝试使用委托从我的 class Gameclock
更新我的 @IBOutlet weak var gameclockLabel: UILabel!
。
我已经阅读并测试了大约一百万种不同的方法,但无法使其发挥作用。我觉得我读得越多就越糊涂。
你可以在这里阅读更多关于我正在尝试做的事情:
根据那个问题的答案,我添加了这个:var gameClock = Gameclock()
所以我能够在 class Gameclock
中启动一个函数,首先我尝试用我的 class ViewController: UIViewController
做同样的事情但是那没有用,所以这就是为什么我决定尝试使用委托。您认为委托是解决这个问题的正确方法吗?
我稍后会在 类 中单独添加几个计时器,所以也许有更好的方法。
如果有人能指出我正确的方向,那就太好了。起初我认为这不会太复杂,但似乎我误会了:)
完整代码如下:
import UIKit
protocol test1: class {
func updateLabel()
}
class ViewController: UIViewController, test1 {
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
override func viewDidLoad() {
super.viewDidLoad()
gameclockLabel.text = "00:00"
}
var gameClock = Gameclock()
var startstopPushed: Bool = false
@IBOutlet weak var gameclockLabel: UILabel!
@IBOutlet weak var startstop: UIButton!
@IBAction func startStopbutton(sender: AnyObject) {
if startstopPushed == false {
gameClock.startGameclock()
startstop.setImage(UIImage(named: "stop.png"), forState: UIControlState.Normal)
startstopPushed = true
}
else
{
gameClock.stopGameclock()
startstop.setImage(UIImage(named: "start.png"), forState: UIControlState.Normal)
startstopPushed = false
}
}
func updateLabel() {
print("updated")
gameclockLabel.text = gameClock.timeString
}
}
class Gameclock : NSObject {
var gameclockTimer = NSTimer()
var timeString: String = ""
var seconds = 0
var minutes = 0
weak var delegate: test1?
func startGameclock() {
print("start")
gameclockTimer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("updateGameclock"), userInfo: nil, repeats: true)
}
func stopGameclock() {
self.gameclockTimer.invalidate()
print("stopp")
}
func updateGameclock() {
seconds += 1
if seconds == 60 {
minutes += 1
seconds = 0
}
let secondsString = seconds > 9 ? "\(seconds)" : "0\(seconds)"
let minutesString = minutes > 9 ? "\(minutes)" : "0\(minutes)"
timeString = "\(minutesString):\(secondsString)"
print(timeString)
delegate?.updateLabel()
}
}
您实际上还没有将 ViewController
实例设置为 GameClock
的委托,因此不会调用您的 updateLabel
方法;
override func viewDidLoad() {
super.viewDidLoad()
gameclockLabel.text = "00:00"
self.gameClock.delegate=self
}
我正在尝试使用委托从我的 class Gameclock
更新我的 @IBOutlet weak var gameclockLabel: UILabel!
。
我已经阅读并测试了大约一百万种不同的方法,但无法使其发挥作用。我觉得我读得越多就越糊涂。
你可以在这里阅读更多关于我正在尝试做的事情:
根据那个问题的答案,我添加了这个:var gameClock = Gameclock()
所以我能够在 class Gameclock
中启动一个函数,首先我尝试用我的 class ViewController: UIViewController
做同样的事情但是那没有用,所以这就是为什么我决定尝试使用委托。您认为委托是解决这个问题的正确方法吗?
我稍后会在 类 中单独添加几个计时器,所以也许有更好的方法。
如果有人能指出我正确的方向,那就太好了。起初我认为这不会太复杂,但似乎我误会了:)
完整代码如下:
import UIKit
protocol test1: class {
func updateLabel()
}
class ViewController: UIViewController, test1 {
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
override func viewDidLoad() {
super.viewDidLoad()
gameclockLabel.text = "00:00"
}
var gameClock = Gameclock()
var startstopPushed: Bool = false
@IBOutlet weak var gameclockLabel: UILabel!
@IBOutlet weak var startstop: UIButton!
@IBAction func startStopbutton(sender: AnyObject) {
if startstopPushed == false {
gameClock.startGameclock()
startstop.setImage(UIImage(named: "stop.png"), forState: UIControlState.Normal)
startstopPushed = true
}
else
{
gameClock.stopGameclock()
startstop.setImage(UIImage(named: "start.png"), forState: UIControlState.Normal)
startstopPushed = false
}
}
func updateLabel() {
print("updated")
gameclockLabel.text = gameClock.timeString
}
}
class Gameclock : NSObject {
var gameclockTimer = NSTimer()
var timeString: String = ""
var seconds = 0
var minutes = 0
weak var delegate: test1?
func startGameclock() {
print("start")
gameclockTimer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("updateGameclock"), userInfo: nil, repeats: true)
}
func stopGameclock() {
self.gameclockTimer.invalidate()
print("stopp")
}
func updateGameclock() {
seconds += 1
if seconds == 60 {
minutes += 1
seconds = 0
}
let secondsString = seconds > 9 ? "\(seconds)" : "0\(seconds)"
let minutesString = minutes > 9 ? "\(minutes)" : "0\(minutes)"
timeString = "\(minutesString):\(secondsString)"
print(timeString)
delegate?.updateLabel()
}
}
您实际上还没有将 ViewController
实例设置为 GameClock
的委托,因此不会调用您的 updateLabel
方法;
override func viewDidLoad() {
super.viewDidLoad()
gameclockLabel.text = "00:00"
self.gameClock.delegate=self
}