2016-04-14 13 views
0

Ich habe eine Anmeldeseite, die den Rest der Anwendung segelt. Im Rest meiner Anwendung erstrecken sich die restlichen View-Controller von meinem eigenen definierten 'BaseViewController'.Logout-Anwendung mit NSTimer

Ich habe die folgende Frage?

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. das Verfahren touchesBegan() nicht gefeuert wird erhalten, wenn auf UITextField oder UITextView klicken.

  2. Ich habe eine Einstellungen UIViewController mit einer UISegmentedControl mit zwei Behältern und zwei UIViewController. Alle diese drei UIViewController stammen von meiner BaseViewController. Wenn ich auf die anderen zwei UIViewController klicke, werden drei Instanzen von BaseViewController erstellt, die ich vermeiden möchte.

+0

Punkt # 2: Was Sie sehen, ist, wie abgeleitete Objekte funktionieren. Eine Unterklasse ist eine Implementierung ihrer Elternklasse ... plus ein paar Sachen. –

+0

@Phillip Mills, was ich erreichen möchte, ist meine Anwendung nach einer gewissen Zeit abmelden. – Cloy

+0

Das ist in Ordnung. Was ich sage ist, dass das Setzen der Timer-Logik in einer Basisklasse, die mehrere Kinder hat, keinen Sinn ergibt, wenn Sie nur einen Timer für die App haben wollen. Die Details dessen, was es tut und wie es zurückgesetzt wird, sind nicht wirklich wichtig, bis die Struktur dem entspricht, was Sie brauchen. –

Antwort

1

Die erste Idee, die in den Sinn kommt, ist eine InactivityMonitor Klasse zu erfinden und die AppDelegate eine Instanz, dass schaffen haben. Lass es den Timer besitzen und höre auf eine Art "Refresh" -Benachrichtigung.

View-Controller können diese Benachrichtigungen posten, wenn sie Berührungen erhalten, damit der Timer zurückgesetzt werden kann.

Sie benötigen wahrscheinlich auch Ihre Controller als Delegaten für Textfelder und Ansichten, damit sie auch Benachrichtigungen für diese Art von Aktivität senden können. In der Tat kann der schwierigste Teil darin bestehen, alle Benutzeraktivitäten zu identifizieren, die beachtet werden müssen, abhängig davon, welche Arten von UI-Elementen Sie haben.

Die andere Sache, über die ich nachdenken sollte, ist, wie Ihre Regeln auf Hintergrund/Vordergrund Anwendungsereignisse angewendet werden sollten.

+0

Vielen Dank @Phillip Mills ................ Ich habe den Timer in App Delegate hinzugefügt und habe den Timer auch für die Tabs funktioniert .......... ..... Jetzt in jedem meiner UIViewController gibt es eine einfache Möglichkeit zu wissen, dass der Benutzer bei der Interaktion mit dem Bildschirm .......... ich versuchte TouchesBegan ........... .... diese Methode erkennt jedoch nur den Teil des Bildschirms, der leer ist ......... – Cloy

+1

In Objective-C können Sie jedes Ereignis abfangen und entscheiden, ob es den Timer zurücksetzen soll. In Swift müssen Sie möglicherweise Benutzeraktionen einzeln abfangen und das Zurücksetzen für jeden auslösen. Beachten Sie jedoch die Dokumentation zu 'sendEvent:' in 'UIApplication':" * Wenn Sie es benötigen, können Sie eingehende Ereignisse abfangen, indem Sie die UIApplication ableiten und diese Methode überschreiben. " –