2016-04-14 121 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並重寫此方法來攔截傳入事件。*」 –