Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift-使用计时器检测用户不活动,然后在4分钟后显示警报,提示用户是否仍在活动_Ios_Swift_Timer_Uialertcontroller_Uialertaction - Fatal编程技术网

Ios Swift-使用计时器检测用户不活动,然后在4分钟后显示警报,提示用户是否仍在活动

Ios Swift-使用计时器检测用户不活动,然后在4分钟后显示警报,提示用户是否仍在活动,ios,swift,timer,uialertcontroller,uialertaction,Ios,Swift,Timer,Uialertcontroller,Uialertaction,我有一个基本的iPad应用程序,它由4个视图组成。在整个应用程序中,我希望能够检测到用户不活动,然后在4分钟后显示一个警报,询问用户是否仍在 我已经找到了一些有用的资源,用于。我已经玩了这些教程,可以让计时器自己工作。然而,这是我第一次在Swift中开发,所以我想了解一些将计时器连接到警报的最佳方法的指导?我希望计时器运行4分钟,然后创建警报 我还想知道最好的地方是把这些元素的代码放在哪里,这样它们就可以在我的所有4个视图中工作。例如,是否有一个地方可以放置代码并重用它,而不是让它在4个视图中重

我有一个基本的iPad应用程序,它由4个视图组成。在整个应用程序中,我希望能够检测到用户不活动,然后在4分钟后显示一个警报,询问用户是否仍在

我已经找到了一些有用的资源,用于。我已经玩了这些教程,可以让计时器自己工作。然而,这是我第一次在Swift中开发,所以我想了解一些将计时器连接到警报的最佳方法的指导?我希望计时器运行4分钟,然后创建警报


我还想知道最好的地方是把这些元素的代码放在哪里,这样它们就可以在我的所有4个视图中工作。例如,是否有一个地方可以放置代码并重用它,而不是让它在4个视图中重复

您可以在AppDelegate本身中运行计时器,并从AppDelegate显示如下所示的警报

func showAlertFromAppDelegates(){
    let alertVC = UIAlertController(title: "Oops" , message: "Presented Alert from AppDelegates", preferredStyle: UIAlertController.Style.alert)
    let okAction = UIAlertAction(title: "Okay", style: UIAlertAction.Style.cancel) { (alert) in

    }
    alertVC.addAction(okAction)

   var presentVC = self.window!.rootViewController
   while let next = presentVC?.presentedViewController
   {
       presentVC = next
   }
   presentVC?.present(alertVC, animated: true, completion: nil)

}
编辑: 添加了与计时器相关的代码,当要启动非活动时调用startTimer(),当非活动结束时调用stopTimer()

func startTimer()
    {
        let interval = 4*60
        timer = Timer.scheduledTimer(timeInterval: TimeInterval(interval), target: self, selector: #selector(self.showAlertFromAppDelegates), userInfo: nil, repeats: true)
    }
    func stopTimer()
    {
        if let timer = timer
        {
            timer.invalidate()
        }
        timer = nil
    }

首先,您可以按照此处的说明设置计时器:

然后,您可以执行以下操作来处理超时通知:

extension UIViewController {
    func observeTimeout() {
        NotificationCenter.default.addObserver(
            self,
            selector: #selector(handleTimeout),
            name: .appTimeout,
            object: nil)
    }

    @objc func handleTimeout() {
        let alert = UIAlertController(title: "Timeout", message: "Oh no!", preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { _ in
        }))
        present(alert, animated: true, completion: nil)
    }
}
然后在每个视图控制器中执行以下操作以注册超时:

class SomeViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        observeTimeout()
    }
}

这是如何检测不活动的?我的答案是“我想要一些关于如何将计时器连接到警报的最佳方法的指导”。我的假设是他知道如何检测不活动,他只需要帮助管理计时器和警报。我不同意这一点,但让我们看看OP是否会得到一些澄清。他显然是这么说的“我还想知道最好的地方是把这些元素的代码放在哪里,这样它们就能在我所有的4个观点中发挥作用。”我不明白为什么人们会投票反对这个问题。