ios - swift - 尝试用委托(delegate)更新 UILabel

标签 ios swift delegates uilabel

我正在尝试使用委托(delegate)从我的 class Gameclock 更新我的 @IBOutlet weak var gameclockLabel: UILabel!。 我已经阅读并测试了大约一百万种不同的方法,但无法使其发挥作用。我认为我对它的了解越多,我就越困惑。

您可以在这里阅读更多关于我正在尝试做的事情: swift invalidate timer in function

根据那个问题的答案,我添加了这个:var gameClock = Gameclock() 所以我能够在 class Gameclock 中启动一个函数,首先我尝试做与我的 class ViewController: UIViewController 相同,但这不起作用,所以这就是我决定尝试使用委托(delegate)的原因。您认为委托(delegate)是解决这个问题的正确方法吗?

我稍后会在单独的类中添加几个计时器,所以也许有更好的方法。

如果有人能指出我正确的方向,那就太好了。起初我认为这不会太复杂,但似乎我误会了:)

完整代码如下:

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 的委托(delegate),因此您的 updateLabel 方法将不会被调用;

override func viewDidLoad() {
    super.viewDidLoad()
    gameclockLabel.text = "00:00"
    self.gameClock.delegate=self
}

关于ios - swift - 尝试用委托(delegate)更新 UILabel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35833674/

相关文章:

ios - 在 UITableView 编辑模式下,UITableView :didSelectRowAtIndexPath: doesn't respond

enums - 当协议(protocol)包含 Swift 中的枚举时检查协议(protocol)一致性?

swift - 使用变换旋转后,UI View 不会移动到屏幕边界

将 Error 转换为 NSError 时,Swift 3 自定义 URLProtocol 崩溃

ios - 在 Swift 中定义协议(protocol)

c# - 在 C# 中调用在其参数中使用表达式和委托(delegate)的扩展方法

ios - 根据数据返回零单元

ios - 为什么程序在登录时不执行segue?

ios - 在 Swift 中禁用 ViewController

JavaScript 重复委托(delegate)创建