【问题标题】:Logout application using NSTimer使用 NSTimer 注销应用程序
【发布时间】:2016-04-14 12:24:26
【问题描述】:

我有一个登录页面,它连接到应用程序的其余部分。 在我的应用程序的其余部分,其余视图控制器从我自己定义的“BaseViewController”扩展而来。

我有以下问题?

 import UIKit

 class BsgBaseViewController: UIViewController {
 var nsTimerObj: NSTimer!
 func resetTimer(addTimeToTimeOutThread: NSTimeInterval){
    nsTimerObj?.invalidate()

    let nsTimerObjTemp = NSTimer.scheduledTimerWithTimeInterval(10.0, target: self, selector: "handleIdleEvent:", userInfo: nil, repeats: false)
    nsTimerObj = nsTimerObjTemp

 }


func handleIdleEvent(timer: NSTimer) {

        let createAccountErrorAlert: UIAlertView = UIAlertView()
        createAccountErrorAlert.delegate = self
        createAccountErrorAlert.title = ("Title")
        createAccountErrorAlert.message = "Due to the security policies your session has been timed out. We have to log you out."
        createAccountErrorAlert.addButtonWithTitle("OK")
        createAccountErrorAlert.show()

}

   override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    print("user touched")
    self.resetTimer(HardCodedValues().hardCodedTimeOutApplication)
}

override func viewDidAppear(animated: Bool) {
    self.resetTimer(HardCodedValues().hardCodedTimeOutApplication)
    print("appear")
}

override func viewWillDisappear(animated: Bool) {
    self.resetTimer(HardCodedValues().hardCodedTimeOutApplication)
    print("disappear")
}

}
  1. 单击UITextField 或UITextView 时不会触发touchesBegan() 方法。

  2. 我有一个设置UIViewController 和一个UISegmentedControl,有两个容器和两个UIViewController。所有这三个UIViewController 都来自我的BaseViewController。当我点击另外两个UIViewController 时,三个BaseViewController 实例被创建,这是我想避免的。

【问题讨论】:

  • 第 2 点:您所看到的是派生对象的工作方式。子类是其父类的实现......加上一些东西。
  • @Phillip Mills 我想要实现的是在一段时间后注销我的应用程序。
  • 没关系。我要说的是,如果您只希望应用程序有一个计时器,那么将计时器逻辑放在具有多个子类的基类中是没有意义的。在结构符合您的需要之前,它的作用以及如何重置的细节并不重要。
  • @Phillip Mills............我错了............我应该如何创建一个通用的 NSTimer整个应用程序的对象。

标签: ios swift uiviewcontroller nstimer uicontainerview


【解决方案1】:

想到的第一个想法是发明一个InactivityMonitor 类并让应用程序委托创建一个实例。让它拥有计时器并监听某种“刷新”通知。

视图控制器可以在触摸时发布这些通知,以便计时器可以重置。

您可能还需要您的控制器成为文本字段和视图的代表,以便他们也可以发布有关此类活动的通知。事实上,最困难的部分可能是识别所有需要注意的用户活动,具体取决于您拥有的 UI 元素类型。

我想考虑的另一件事是您的规则应如何应用于后台/前台应用程序事件。

【讨论】:

  • 谢谢@Phillip Mills ......我在 App Delegate 中添加了计时器,并且计时器也可以在选项卡上正常工作...... ......现在在我的每个 UIViewController 中都有一种简单的方法可以知道用户在与屏幕交互............我尝试了 touchesBegan...... ......但是这个方法只检测到屏幕的空白部分............
  • 在 Objective-C 中,您可以拦截任何事件并决定它是否应该重置计时器。在 Swift 中,您可能必须单独拦截用户操作并为每个操作触发重置。不过,请参阅 UIApplication 中的 sendEvent: 文档:“如果需要,可以通过继承 UIApplication 并覆盖此方法来拦截传入事件。”
猜你喜欢
  • 2014-09-23
  • 2014-02-15
  • 1970-01-01
  • 2021-08-09
  • 2013-08-19
  • 2016-02-07
  • 2016-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多