From cdab5370af7647d00cdf71a5e6134569ce66dc2b Mon Sep 17 00:00:00 2001 From: Hailey Date: Tue, 18 Jun 2024 08:44:09 -0700 Subject: [PATCH] fix (iOS): fix `selectTextOnFocus` in Fabric and non-Fabric by calling `selectAll` after `becomeFirstResponder` (#44307) Summary: Fixes https://github.com/facebook/react-native/issues/41988 Hopefully even if this isn't the right way to go about solving this, it at least points in the right direction for a different fix! Currently - both on Paper and Fabric - the `selectTextOnFocus` prop does not work as expected on a single line text input. It seems that if the `UITextField` has not yet become the first responder, the text will be briefly selected but then deselected immediately afterward. This can be seen in the tester when running for either Fabric or Paper (video using Fabric) https://github.com/facebook/react-native/assets/153161762/aa9c609e-6eb8-4177-a41f-32aae53c06ac Instead, we can move the `selectAll` call to `reactFocus` in `RCTBaseTextInputView` or `focus` `RCTTextInputComponentView` - both of which first call `becomeFirstResponder` - to get the expected result. ## Changelog: [IOS] [FIXED] - fix selectTextOnFocus in Fabric and non-Fabric by calling selectAll after becomeFirstResponder Pull Request resolved: https://github.com/facebook/react-native/pull/44307 Test Plan: * Test changes on RN Tester (iOS) https://pxl.cl/55kDc Reviewed By: cipolleschi Differential Revision: D56699773 Pulled By: fabriziocucci fbshipit-source-id: ed092835f3c602e2c50a4198357653a9cef942d9 --- .../Text/TextInput/RCTBaseTextInputView.mm | 16 ++++++------- .../TextInput/RCTTextInputComponentView.mm | 24 +++++++++---------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/packages/react-native/Libraries/Text/TextInput/RCTBaseTextInputView.mm b/packages/react-native/Libraries/Text/TextInput/RCTBaseTextInputView.mm index 826ff3a0de2..72cf885c37e 100644 --- a/packages/react-native/Libraries/Text/TextInput/RCTBaseTextInputView.mm +++ b/packages/react-native/Libraries/Text/TextInput/RCTBaseTextInputView.mm @@ -375,14 +375,6 @@ RCT_NOT_IMPLEMENTED(-(instancetype)initWithFrame : (CGRect)frame) - (void)textInputDidBeginEditing { - if (_clearTextOnFocus) { - self.backedTextInputView.attributedText = [NSAttributedString new]; - } - - if (_selectTextOnFocus) { - [self.backedTextInputView selectAll:nil]; - } - [_eventDispatcher sendTextEventWithType:RCTTextEventTypeFocus reactTag:self.reactTag text:[self.backedTextInputView.attributedText.string copy] @@ -600,6 +592,14 @@ RCT_NOT_IMPLEMENTED(-(instancetype)initWithFrame : (CGRect)frame) - (void)reactFocus { [self.backedTextInputView reactFocus]; + + if (_clearTextOnFocus) { + self.backedTextInputView.attributedText = [NSAttributedString new]; + } + + if (_selectTextOnFocus) { + [self.backedTextInputView selectAll:nil]; + } } - (void)reactBlur diff --git a/packages/react-native/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputComponentView.mm b/packages/react-native/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputComponentView.mm index 369cdf656a3..51914b7448e 100644 --- a/packages/react-native/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputComponentView.mm +++ b/packages/react-native/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputComponentView.mm @@ -280,18 +280,6 @@ static NSSet *returnKeyTypesSet; - (void)textInputDidBeginEditing { - const auto &props = static_cast(*_props); - - if (props.traits.clearTextOnFocus) { - _backedTextInputView.attributedText = nil; - [self textInputDidChange]; - } - - if (props.traits.selectTextOnFocus) { - [_backedTextInputView selectAll:nil]; - [self textInputDidChangeSelection]; - } - if (_eventEmitter) { static_cast(*_eventEmitter).onFocus([self _textInputMetrics]); } @@ -431,6 +419,18 @@ static NSSet *returnKeyTypesSet; - (void)focus { [_backedTextInputView becomeFirstResponder]; + + const auto &props = static_cast(*_props); + + if (props.traits.clearTextOnFocus) { + _backedTextInputView.attributedText = nil; + [self textInputDidChange]; + } + + if (props.traits.selectTextOnFocus) { + [_backedTextInputView selectAll:nil]; + [self textInputDidChangeSelection]; + } } - (void)blur