2016-04-14 4 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() не уволят при нажатии на UITextField или UITextView.

  2. У меня есть Настройки UIViewController с UISegmentedControl с двумя контейнерами и двумя UIViewController. Все эти три UIViewController происходят от моего BaseViewController. Когда я нажимаю на другие два UIViewController, создаются три экземпляра BaseViewController, которые я хочу избежать.

+0

Пункт № 2: То, что вы видите, - это то, как работают производные объекты. Подкласс - это реализация его родительского класса ... плюс некоторые вещи. –

+0

@Phillip Mills, чего я хочу достичь, это выйти из моего приложения через определенный промежуток времени. – Cloy

+0

Все в порядке. Я говорю о том, что включение таймера в базовый класс с несколькими дочерними элементами не имеет смысла, если вы хотите только один таймер для приложения. Детали того, что он делает и как он получает сброс, не имеют большого значения, пока структура не соответствует тому, что вам нужно. –

ответ

1

Первая мысль, которая приходит на ум, чтобы изобрести InactivityMonitor класс и иметь приложение делегат создать экземпляр этого. Пусть он владеет таймером и прослушивает какое-то уведомление об обновлении.

Контроллеры просмотра могут отправлять эти уведомления, когда они получают касания, чтобы таймер мог сбросить настройки.

Возможно, вам также необходимы, чтобы ваши контроллеры были делегатами для текстовых полей и представлений, чтобы они могли публиковать уведомления об этом виде деятельности. На самом деле, самая сложная часть может идентифицировать всю активность пользователя, которая должна быть замечена, в зависимости от того, какие элементы пользовательского интерфейса у вас есть.

Другая вещь, о которой я хотел бы подумать, - это то, как ваши правила должны применяться к событиям приложений фона/переднего плана.

+0

Спасибо @Phillip Mills ................ Я добавил таймер в App Delegate и получил таймер, работающий нормально для вкладок тоже .......... ..... Теперь в каждом из моих UIViewController есть простой способ узнать, что пользователь взаимодействует с экраном .......... я пробовал прикосновенияBegan ........... .... этот метод, однако, обнаруживает только ту часть экрана, которая пуста ......... – Cloy

+1

В Objective-C вы можете перехватить любое событие и решить, должен ли он сбросить таймер. В Swift вам, возможно, придется перехватывать действия пользователя индивидуально и запускать сброс для каждого. Хотя, см. Документацию для 'sendEvent:' в 'UIApplication': * * Если вам это нужно, вы можете перехватить входящие события путем подклассификации UIApplication и переопределения этого метода. *" –