2

我想在我当前的项目中实现会话时间功能。因此,为此我试图继承UIWindow和覆盖touchesBeganandtouchesEnded方法。

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没有被调用。我无法弄清楚我做错了什么。

4

4 回答 4

5

touchesBegan(_:with:)除非没有其他人来捕获触摸事件,否则不会为您的窗口调用 API 。这通常不会发生,因为您希望您的 UI 元素能够接收触摸。

你想在你的窗口子类中实现的是sendEvent(:_)将你的逻辑放在那里。不要忘记调用超级实现来传递事件。

这种方法的一个小问题是你会听到一些不是触摸事件的事件,但这可能不是问题,因为它们大多是用户生成的。

于 2016-09-04T09:56:14.350 回答
0

跟踪会话的更好方法是注册UIApplication通知,例如UIApplicationDidEnterBackgroundNotificationUIApplicationDidFinishLaunchingNotification

应用程序通知的完整列表可在UIApplication类参考的底部找到。您可以创建一个会话跟踪器类来干净地监听这些,而不会干扰代码的其他部分。

于 2016-09-05T17:20:50.520 回答
0

而不是子类化UIWindow。您可以UITapGestureRecognizerAppDelegate的窗口中添加。

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
于 2016-09-04T18:42:33.393 回答
0

我试图继承 UIWindow 并覆盖方法 touchesBegan,touchesEnded 当窗口有一个 rootViewController 检查演示项目时,这些方法被调用。示例应用 TouchTest

还要检查这个方法 - (void)sendEvent:(UIEvent *)event

根据文档:您可以调用此方法将自定义事件分派到窗口的响应程序链。Window 对象将触摸事件分派给发生触摸的视图,并将其他类型的事件分派给最合适的目标对象

于 2016-09-05T16:57:15.637 回答