每天上午8:30如何调用函数

时间:2019-02-04 22:37:22

标签: ios swift

我正在尝试制作测验应用程序,我希望它每天早上8:30展示一个新问题,并在下午6点消失。我在网上看到主要的方法是使用计时器,但是我的问题是,如果人更改时区,计时器会不会不同步?还是每天重启?这是我的代码:(请注意,我是初学者)

此外,每当我加载我的应用程序时,问题就会出现一秒钟,然后消失,然后在计时器计时结束后再次出现。

@objc func loadQuestion() {
    questionView.alpha = 0
    self.view.addSubview(questionView)
    questionView.center = self.view.center

    questionView.transform = CGAffineTransform.init(scaleX: 1.3, y: 1.3)

    UIView.animate(withDuration: 0.4) {
        self.visualEffectView.effect = self.effect
        self.questionView.alpha = 1
        self.questionView.transform = CGAffineTransform.identity

        let date = Date().addingTimeInterval(30600)
        let timer = Timer(fireAt: date, interval: 0, target: self, selector: #selector(self.loadQuestion), userInfo: nil, repeats: false)
        RunLoop.main.add(timer, forMode: .common)
        }
    }

@objc func loadOutQuestion() {
    UIView.animate(withDuration: 0.3, animations: {
        self.questionView.transform = CGAffineTransform.init(scaleX: 1.3, y: 1.3)
        self.questionView.alpha = 0

        self.visualEffectView.effect = nil

        let date = Date().addingTimeInterval(64800)
        let timer = Timer(fireAt: date, interval: 0, target: self, selector: #selector(self.loadOutQuestion), userInfo: nil, repeats: false)
        RunLoop.main.add(timer, forMode: .common)

    }) { (succcess:Bool) in
        self.questionView.removeFromSuperview()
    }
}

3 个答案:

答案 0 :(得分:0)

这将从用户的本地时间上午8:30和下午6:00结束。

var calendar = Calendar.current
calendar.timeZone = NSTimeZone.local
let startDate = calendar.startOfDay(for: Date())
let EightAM = calendar.date(byAdding: .hour, value: 8, to: startDate)!
let EightThirtyAM = calendar.date(byAdding: .hour, value: 30, to: EightAM)!
let SixPM = calendar.date(byAdding: .hour, value: 18, to: startDate)!

如果此时未打开该应用,则不会触发任何事情。

在这种情况下,您可以执行的操作是在ViewDidLoad中,选中

if Date() > EightThirtyAM && Date() < SixPM {
     showQuiz()
} else {
     hideQuiz()
}

如果您希望它在下午6:00点消失,请添加

let timer = Timer(fireAt: SixPM, interval: 0, target: self, selector: #selector(hideQuiz), userInfo: nil, repeats: false)
RunLoop.main.add(timer, forMode: .common)

如果您喜欢component解决方案,请尝试。

var calendar = Calendar.current
calendar.timeZone = NSTimeZone.local
let hours = calendar.component(.hour, from: Date())
let minutes = calendar.component(.minute, from: Date())
let timeFloat:Float = Float(hours) + Float(minutes)/60
if timeFloat > 8.5 && timeFloat < 18 {
    showQuiz
} else {
    hideQuiz
}

答案 1 :(得分:0)

您可以使用“ 本地通知”。我放入了苹果示例代码,请检查它,然后您可以根据需要修改示例代码。

配置本地通知的步骤如下:

  1. 使用通知详细信息创建并配置UNMutableNotificationContent对象。
  2. 创建一个UNCalendarNotificationTriggerUNTimeIntervalNotificationTriggerUNLocationNotificationTrigger对象来描述传递通知的条件。
  3. 使用内容和触发信息创建一个UNNotificationRequest对象。
  4. 调用addNotificationRequest:withCompletionHandler:方法来安排通知;请参阅安排本地通知的发送时间

Official Document

示例代码

let content = UNMutableNotificationContent()
// Replace "Wake up!" with your "question title"
content.title = NSString.localizedUserNotificationString(forKey: "Wake up!", arguments: nil)
// Replace "Rise and shine! It's morning time!" with your "question description"
content.body = NSString.localizedUserNotificationString(forKey: "Rise and shine! It's morning time!",
                                                        arguments: nil)

// Configure the trigger for a 7am wakeup.
var dateInfo = DateComponents()
dateInfo.hour = 7
dateInfo.minute = 0
let trigger = UNCalendarNotificationTrigger(dateMatching: dateInfo, repeats: false)

// Create the request object.
let request = UNNotificationRequest(identifier: "MorningAlarm", content: content, trigger: trigger)

答案 2 :(得分:0)

这是我到目前为止所拥有的。我不知道我是否距离解决此问题越来越近

@objc func loadQuestion() {
    self.view.addSubview(questionView)
    questionView.center = self.view.center

    questionView.transform = CGAffineTransform.init(scaleX: 1.3, y: 1.3)
    questionView.alpha = 0

    var dateComponents = DateComponents()
    dateComponents.hour = 08
    dateComponents.minute = 30

    let currentTime = DateComponents()
    let hour = currentTime.hour
    let minute = currentTime.minute


    var calendar = Calendar.current
    calendar.timeZone = NSTimeZone.local

    if hour >= dateComponents {

        UIView.animate(withDuration: 0.4) {
            self.visualEffectView.effect = self.effect
            self.questionView.alpha = 1
            self.questionView.transform = CGAffineTransform.identity
        }
    }
}