【问题标题】:Swift - Update/Refresh Label that Displays TimeSwift - 更新/刷新显示时间的标签
【发布时间】:2017-01-23 04:44:13
【问题描述】:

我有一个以 12 小时格式显示当前时间的标签。

但是,它不会在每次分钟/小时更改时更新/刷新时间。

我需要它在时间变化时自动将标签更改为当前时间。

【问题讨论】:

    标签: ios swift swift3


    【解决方案1】:

    Swift 3 解决方案

    class ViewController {
    
        @IBOutlet weak var timeLabel: UILabel!
        var timer: Timer?
    
        let formatter: DateFormatter = {
            let tmpFormatter = DateFormatter()
            tmpFormatter.dateFormat = "hh:mm a"
            return tmpFormatter
        }()
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            timer = Timer.scheduledTimer(timeInterval: 60, target: self, selector: #selector(self.getTimeOfDate), userInfo: nil, repeats: true)
        }
    
        override func viewWillDisappear(_ animated: Bool) {
            super.viewWillDisappear(animated)
            timer?.invalidate()
        }
    
        func getTimeOfDate() {
            var curDate = Date()
    
            timeLabel.text = formatter.string(from: curDate)
        }
    
    }
    

    【讨论】:

    • @reecefox 检查我的答案
    • 请为变量、常量、属性和案例使用小写名称。
    • 调用invalidate()后是否需要设置定时器为nil?
    • @GaneshKumar 但invalidate() 还没有释放内存吗?有什么理由在invalidate() 之后调用timer = nil 吗?我认为您没有义务在 ARC 下取消 Timer 实例。
    • 这不是很好。它以viewDidLoad 开始,以viewWillDisappear 结束。这意味着当你导航或按下主页按钮时它会停止,当你回到那里时不会重新启动。如果使用viewWillDisappear,您应该使用viewWillAppear 来启动它。如果使用viewDidLoad,则使用deinit
    【解决方案2】:

    用您的 ViewController 代码替换以下代码,然后将 IBOutlet 连接到 showTimeLbl

    class ViewController: UIViewController {
    
        @IBOutlet weak var showTimeLbl: UILabel!
        var timeCount:Int = 0
        var timer:Timer!
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            if(timer != nil)
            {
                timer.invalidate()
            }
            timer = Timer(timeInterval: 1.0, target: self, selector: #selector(ViewController.timerDidFire), userInfo: nil, repeats: true)
            RunLoop.current.add(timer, forMode: RunLoopMode.commonModes)
    
        }
    
        func timerDidFire()
        {
            timeCount += 1
    
            showTimeLbl.text = NSString(format: "%02d:%02d:%02d", timeCount/3600,(timeCount/60)%60,timeCount%60) as String
        }
    
        override func viewWillDisappear(_ animated: Bool) {
            super.viewWillDisappear(true)
            timer?.invalidate()
            timer = nil
        }
    
    }
    

    【讨论】:

    • 相当肯定 swift 自发布以来已经更新了数千次,因此我问了这个问题,因为其他所有的都已经过时了。
    • @reecefox 请检查我是否在 swift 3.0 中更新了我的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-03
    • 1970-01-01
    • 2019-08-14
    • 1970-01-01
    相关资源
    最近更新 更多