2016-04-14 131 views
0

我有一个登录页面,其中延伸到应用程序的其余部分。 在我的应用程序的其余部分中,剩余的视图控制器从我自己定义的“BaseViewController”中扩展。使用NSTimer注销应用程序

我有以下问题吗?

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. touchesBegan()UITextFieldUITextView点击时不会被解雇的方法。

  2. 我有一个设置UIViewControllerUISegmentedControl与两个容器和两个UIViewController。所有这三个UIViewController都来自我的BaseViewController。当我点击其他两个UIViewController三个BaseViewController的实例被创建,我想避免。

+0

第2点:你看到的只是衍生物的工作方式。一个子类是它的父类的实现...加上一些东西。 –

+0

@Phillip Mills我想要实现的是在一段时间后注销我的应用程序。 – Cloy

+0

这很好。我说的是,如果你只需要一个定时器的应用程序,把计时器逻辑放在一个有多个孩子的基类中是没有意义的。它的功能和重置方式的细节在结构匹配你所需要的之前并不重要。 –

回答

1

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

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

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

我想要考虑的另一件事是如何将您的规则应用于背景/前景应用程序事件。

+0

谢谢@Phillip Mills ................我在App Delegate中添加了定时器,并且定时器也可以在标签中工作得很好.......... .....现在在我的每个UIViewController有一个简单的方法来知道用户在与屏幕交互..........我试过touchesBegan ........... ....但是这种方法只能检测到屏幕空白的部分......... – Cloy

+1

在Objective-C中,您可以拦截任何事件并决定是否应该重置计时器。在Swift中,您可能必须单独拦截用户操作并触发每个用户的重置。尽管如此,请参阅'UIApplication'中的'sendEvent:'的文档:“*如果您需要它,可以通过继承UIApplication并重写此方法来拦截传入事件。*” –