2016-08-31 2 views
2

Я хочу реализовать функцию времени сеанса в моем текущем проекте. Поэтому для этого я пытаюсь подкласса UIWindow и переопределять методы touchesBegan и touchesEnded.Подкласс UIWindow: событие Touches не срабатывает

class BaseWindow: UIWindow { 

    convenience init() { 
     self.init(frame: UIScreen.mainScreen().bounds) 
    } 

    private var sessionTimeOutTimer: NSTimer? 

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     sessionTimeOutTimer?.invalidate() 
    } 

    override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     sessionTimeOutTimer = NSTimer.scheduledTimerWithTimeInterval(60, target: CIAppManager.sharedManger(), selector: #selector(CIAppManager.sessionTimeOut), userInfo: nil, repeats: false) 
    } 
} 

В приложение делегата я сделал это

private let baseWindow = BaseWindow() 
var window: UIWindow? { 
    get { 
     return baseWindow 
    } 
    set {} 
} 

Но проблема touchesBegan и touchesEnded не дозвонились. Я не могу понять, что я делаю неправильно.

+0

Возможно, этот проект вам будет полезен: https: // github.com/marqeta/mqtimeout – shim

+0

покажите нам весь ваш файл _app delegate_, пожалуйста, потому что у меня очень плохое представление о строке 'private let baseWindow = ...', которая, похоже, не служит какой-либо разумной цели, поэтому, пожалуйста, Файл __entire__ был бы более разговорчивым. – holex

ответ

5

API-интерфейс touchesBegan(_:with:) API не будет вызываться для вашего окна, если только кому-то не удастся захватить событие касания. Обычно это не так, поскольку вы хотите, чтобы ваши элементы пользовательского интерфейса получили штрихи.

Что вы хотите реализовать в своем подклассе окна: sendEvent(:_) и поместите свою логику там. Не забудьте вызвать супер-реализацию, чтобы передать события.

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

-2

Вместо подкласса UIWindow. Вы можете добавить UITapGestureRecognizer в окно AppDelegate.

let gestureRecogniger = UITapGestureRecognizer(target: self, action: #selector(yourSelector)) // Implement your selector 
gestureRecogniger.cancelsTouchesInView = false 
window?.addGestureRecognizer(gestureRecogniger) 

Если вам необходимо рассмотреть другие штрихи, кроме кранов использовать UIPanGestureRecognizer и UITapGestureRecognizer вместе.

Если у вас есть подвидов, которые имеют свои собственные жест распознования добавить это расширение

extension AppDelegate: UIGestureRecognizerDelegate { 
    func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool { 
     return true 
    } 
} 

и сделать

gestureRecogniger.delegate = self 
+0

Это будет только краны, а не касания. Он также не будет хорошо воспроизводиться с областями, которые имеют свои собственные распознаватели жестов. –

+0

wow дождь отрицательных голосов. :) Его удивительно, как разные люди используют голоса по-разному. В любом случае .. есть пути вокруг проблем, которые вы заявили. см. мой обновленный ответ. –

0

Я попытался создать подкласс UIWindow и переопределить методы touchesBegan, touchesEnded эти методы становятся вызывается, когда окно имеет rootViewController, проверяя демонстрационный проект. Sample app TouchTest

Также проверьте этот метод - (Недействительными) SendEvent: (UIEvent *) событие

Согласно документации: Вы могли бы назвать этот метод для отправки пользовательского события в цепочке ответчик окна. объектов Окна отправки события прикосновения к виду, в котором произошло прикосновение, и отправка других типов событий, наиболее подходящего целевого объект

0

лучшего способа для отслеживания сеансов будет регистрироваться для UIApplication уведомлений, таких как UIApplicationDidEnterBackgroundNotification и UIApplicationDidFinishLaunchingNotification ,

Полный список уведомлений о применении доступен в нижней части UIApplication class reference. Вы можете создать класс отслеживания сеансов, который прослушивает их чисто, не мешая другим частям вашего кода.

Смежные вопросы