【问题标题】:The timer is terminated when the view changes当视图改变时定时器终止
【发布时间】:2017-01-09 00:33:27
【问题描述】:

我不是以英语为母语的人,我正在与翻译一起写作。 我想让你了解上下文是否奇怪。

我的问题是, 按下按钮时,定时器工作,但切换视图时,定时器不工作。

我想知道即使视图发生变化,如何保持计时器。

var time : Int = 0
var onehour : Int = 60
var timer = Timer()
@IBAction func pressSuncream(_ sender: Any) { // Suncream 버튼
    useSuncream.setImage(UIImage(named: "test"), for: UIControlState.normal)

    if #available(iOS 10.0, *) {
        let content = UNMutableNotificationContent()
        content.title = "hello"
        content.body = "timer"
        content.badge = 1

        let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 3600, repeats: false)
        let request = UNNotificationRequest(identifier: "timerdone", content: content, trigger: trigger)
        UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)

        timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(QuestView.updatetime), userInfo: nil, repeats: true)


    } else {
        // Fallback on earlier versions
    }
}

func updatetime() {
    time += 1
    if time == 60 {
        time = 0
        onehour -= 1
        DispatchQueue.main.async {
            self.suncreamTime.text = String(self.onehour)
        }
    }
}

【问题讨论】:

  • 你如何处理视图?它是释放还是保留在堆栈中?
  • 我正在使用导航控制器视图,当我在主视图中按下按钮时,它会转到 timerView。在 timerView 中,按下按钮激活计时器并按下返回按钮移动到主视图我从主视图切换到 timerView 时使用了 show segue。请理解我是初学者,无法完全理解您的问题。
  • 嗯,这确实回答了它。因此,您有一个视图,其中包含计时器。当你按下一个按钮时,你会返回到前一个视图控制器,视图被释放,它被释放,类中的所有对象也是如此,所以你的计时器不会工作。

标签: swift swift3 view timer


【解决方案1】:

当你切换到主视图时,你可以将onehour的值存储在UserDefaultsoverride func viewWillDisappear(_ animated: Bool) { }处。 当你进入timerView时,你可以在override func viewWillAppear(_ animated: Bool) {}获取值

例如:

override func viewWillDisappear(_ animated: Bool) {
    let userDefault = UserDefaults.standard
    userDefault.set(onehour, forKey: "onehour")
}

override func viewWillAppear(_ animated: Bool) {
    if let onehour = UserDefaults.standard.value(forKey: "onehour") {
        self.onehour = onehour as! String
    }
}

【讨论】:

  • 问题不是他能够访问 Int "60",而是让计时器在多个视图中分配给一个值。
【解决方案2】:

您可以做到这一点的一种方法是将计时器变量设为全局变量。这可能是一种“肮脏”的做法,如果这样做真的有可怕的后果,有人告诉我,我会删除它。

基本上你需要做的就是在任何类之外定义它,像这样:

var timer: NSTimer?
class MyClass: UIViewController {
    ...
}

这样您就可以从任何文件中访问它。我想说的是,除非您必须这样做,否则通常不鼓励您这样做,因此它更像是最后的选择。

【讨论】:

    猜你喜欢
    • 2010-12-02
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-21
    • 2023-03-25
    相关资源
    最近更新 更多