iOS: Avoid category method name clash for UIResponder

As described in Apples documentation, own methods which are added to
existing classes should be prefixed to avoid category method name
clashes. This prefix was missing from the function
currentFirstResponder() which caused issues when closing the virtual
keyboard on some iOS devices.
(see https://developer.apple.com/library/archive/qa/qa1908/_index.html)

Pick-to: 6.6 6.5
Task-number: QTBUG-119601
Change-Id: I82fb8a8beeb0a3234594357f1e1db67b0ae3da36
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
(cherry picked from commit e51b2d70de65f2ac674afb9c7da2a10c7067f142)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Paul Heimann 2024-01-11 14:22:19 +01:00 committed by Qt Cherry-pick Bot
parent 64c906f59e
commit 93ddf89037
6 changed files with 12 additions and 12 deletions

View File

@ -37,7 +37,7 @@ int infoPlistValue(NSString* key, int defaultValue);
QT_END_NAMESPACE QT_END_NAMESPACE
@interface UIResponder (QtFirstResponder) @interface UIResponder (QtFirstResponder)
+ (id)currentFirstResponder; + (id)qt_currentFirstResponder;
@end @end
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE

View File

@ -119,7 +119,7 @@ QT_END_NAMESPACE
@implementation UIResponder (QtFirstResponder) @implementation UIResponder (QtFirstResponder)
+ (id)currentFirstResponder + (id)qt_currentFirstResponder
{ {
if (qt_apple_isApplicationExtension()) { if (qt_apple_isApplicationExtension()) {
qWarning() << "can't get first responder in application extensions!"; qWarning() << "can't get first responder in application extensions!";

View File

@ -121,7 +121,7 @@ static QUIView *focusView()
{ {
[self keyboardWillOrDidChange:notification]; [self keyboardWillOrDidChange:notification];
UIResponder *firstResponder = [UIResponder currentFirstResponder]; UIResponder *firstResponder = [UIResponder qt_currentFirstResponder];
if (![firstResponder isKindOfClass:[QIOSTextInputResponder class]]) if (![firstResponder isKindOfClass:[QIOSTextInputResponder class]])
return; return;
@ -234,7 +234,7 @@ static QUIView *focusView()
if (self.state == UIGestureRecognizerStateBegan) { if (self.state == UIGestureRecognizerStateBegan) {
qImDebug("hide keyboard gesture was triggered"); qImDebug("hide keyboard gesture was triggered");
UIResponder *firstResponder = [UIResponder currentFirstResponder]; UIResponder *firstResponder = [UIResponder qt_currentFirstResponder];
Q_ASSERT([firstResponder isKindOfClass:[QIOSTextInputResponder class]]); Q_ASSERT([firstResponder isKindOfClass:[QIOSTextInputResponder class]]);
[firstResponder resignFirstResponder]; [firstResponder resignFirstResponder];
} }

View File

@ -491,7 +491,7 @@ QIOSMenuItemList QIOSMenu::filterFirstResponderActions(const QIOSMenuItemList &m
// In case of QIOSTextResponder, edit actions will be converted to key events that ends up // In case of QIOSTextResponder, edit actions will be converted to key events that ends up
// triggering the shortcuts of the filtered menu items. // triggering the shortcuts of the filtered menu items.
QIOSMenuItemList filteredMenuItems; QIOSMenuItemList filteredMenuItems;
UIResponder *responder = [UIResponder currentFirstResponder]; UIResponder *responder = [UIResponder qt_currentFirstResponder];
for (int i = 0; i < menuItems.count(); ++i) { for (int i = 0; i < menuItems.count(); ++i) {
QIOSMenuItem *menuItem = menuItems.at(i); QIOSMenuItem *menuItem = menuItems.at(i);

View File

@ -164,7 +164,7 @@
{ {
FirstResponderCandidate firstResponderCandidate(self); FirstResponderCandidate firstResponderCandidate(self);
qImDebug() << "self:" << self << "first:" << [UIResponder currentFirstResponder]; qImDebug() << "self:" << self << "first:" << [UIResponder qt_currentFirstResponder];
if (![super becomeFirstResponder]) { if (![super becomeFirstResponder]) {
qImDebug() << self << "was not allowed to become first responder"; qImDebug() << self << "was not allowed to become first responder";
@ -178,7 +178,7 @@
- (BOOL)resignFirstResponder - (BOOL)resignFirstResponder
{ {
qImDebug() << "self:" << self << "first:" << [UIResponder currentFirstResponder]; qImDebug() << "self:" << self << "first:" << [UIResponder qt_currentFirstResponder];
// Don't allow activation events of the window that we're doing text on behalf on // Don't allow activation events of the window that we're doing text on behalf on
// to steal responder. // to steal responder.
@ -196,11 +196,11 @@
// a regular responder transfer to another window. In the former case, iOS // a regular responder transfer to another window. In the former case, iOS
// will set the new first-responder to our next-responder, and in the latter // will set the new first-responder to our next-responder, and in the latter
// case we'll have an active responder candidate. // case we'll have an active responder candidate.
if (![UIResponder currentFirstResponder] && !FirstResponderCandidate::currentCandidate()) { if (![UIResponder qt_currentFirstResponder] && !FirstResponderCandidate::currentCandidate()) {
// No first responder set anymore, sync this with Qt by clearing the // No first responder set anymore, sync this with Qt by clearing the
// focus object. // focus object.
m_inputContext->clearCurrentFocusObject(); m_inputContext->clearCurrentFocusObject();
} else if ([UIResponder currentFirstResponder] == [self nextResponder]) { } else if ([UIResponder qt_currentFirstResponder] == [self nextResponder]) {
// We have resigned the keyboard, and transferred first responder back to the parent view // We have resigned the keyboard, and transferred first responder back to the parent view
Q_ASSERT(!FirstResponderCandidate::currentCandidate()); Q_ASSERT(!FirstResponderCandidate::currentCandidate());
if ([self currentImeState:Qt::ImEnabled].toBool()) { if ([self currentImeState:Qt::ImEnabled].toBool()) {

View File

@ -304,7 +304,7 @@ inline ulong getTimeStamp(UIEvent *event)
// blocked by this guard. // blocked by this guard.
FirstResponderCandidate firstResponderCandidate(self); FirstResponderCandidate firstResponderCandidate(self);
qImDebug() << "self:" << self << "first:" << [UIResponder currentFirstResponder]; qImDebug() << "self:" << self << "first:" << [UIResponder qt_currentFirstResponder];
if (![super becomeFirstResponder]) { if (![super becomeFirstResponder]) {
qImDebug() << self << "was not allowed to become first responder"; qImDebug() << self << "was not allowed to become first responder";
@ -343,7 +343,7 @@ inline ulong getTimeStamp(UIEvent *event)
- (BOOL)resignFirstResponder - (BOOL)resignFirstResponder
{ {
qImDebug() << "self:" << self << "first:" << [UIResponder currentFirstResponder]; qImDebug() << "self:" << self << "first:" << [UIResponder qt_currentFirstResponder];
if (![super resignFirstResponder]) if (![super resignFirstResponder])
return NO; return NO;
@ -366,7 +366,7 @@ inline ulong getTimeStamp(UIEvent *event)
if ([self isFirstResponder]) if ([self isFirstResponder])
return YES; return YES;
UIResponder *firstResponder = [UIResponder currentFirstResponder]; UIResponder *firstResponder = [UIResponder qt_currentFirstResponder];
if ([firstResponder isKindOfClass:[QIOSTextInputResponder class]] if ([firstResponder isKindOfClass:[QIOSTextInputResponder class]]
&& [firstResponder nextResponder] == self) && [firstResponder nextResponder] == self)
return YES; return YES;