From c432960718de8afb43512f35d5339b3a5b8ead2c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= <tor.arne.vestbo@digia.com>
Date: Thu, 23 Oct 2014 14:28:06 +0200
Subject: [PATCH] iOS: Be more thorough when looking for current first
 responder
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

The technique of sending an action does not always end up at the actual
first responder, but it will end up in a responder in the responder
chain of the first responder, so we continue searching the subviews
recursively until we find the real first-responder.

Change-Id: I6abc9bc18eb127fa4b317cd308783c0ecfcd670a
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@digia.com>
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@digia.com>
---
 src/plugins/platforms/ios/qiosglobal.mm | 22 +++++++++++++++++++++-
 1 file changed, 21 insertions(+), 1 deletion(-)

diff --git a/src/plugins/platforms/ios/qiosglobal.mm b/src/plugins/platforms/ios/qiosglobal.mm
index bc16a7997d3..71d5a580885 100644
--- a/src/plugins/platforms/ios/qiosglobal.mm
+++ b/src/plugins/platforms/ios/qiosglobal.mm
@@ -152,6 +152,22 @@ int infoPlistValue(NSString* key, int defaultValue)
 @implementation QtFirstResponderEvent
 @end
 
+
+@implementation UIView (QtFirstResponder)
+- (UIView*)qt_findFirstResponder
+{
+    if ([self isFirstResponder])
+        return self;
+
+    for (UIView *subview in self.subviews) {
+        if (UIView *firstResponder = [subview qt_findFirstResponder])
+            return firstResponder;
+    }
+
+    return nil;
+}
+@end
+
 @implementation UIResponder (QtFirstResponder)
 
 +(id)currentFirstResponder
@@ -164,7 +180,11 @@ int infoPlistValue(NSString* key, int defaultValue)
 - (void)qt_findFirstResponder:(id)sender event:(QtFirstResponderEvent *)event
 {
     Q_UNUSED(sender);
-    event.firstResponder = self;
+
+    if ([self isKindOfClass:[UIView class]])
+        event.firstResponder = [static_cast<UIView *>(self) qt_findFirstResponder];
+    else
+        event.firstResponder = [self isFirstResponder] ? self : nil;
 }
 @end
 
-- 
GitLab