From ee98ac91a7201dfb674beca048931c546c31b90f Mon Sep 17 00:00:00 2001 From: Gerald Versluis Date: Tue, 9 Nov 2021 16:30:20 +0100 Subject: [PATCH 1/2] Revert "Refactor observer lifecycle (#14828)" This reverts commit f95f671c416a4dc46da1f0783b5cda96d33b85fc. --- .../Renderers/EntryRenderer.cs | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/Xamarin.Forms.Platform.iOS/Renderers/EntryRenderer.cs b/Xamarin.Forms.Platform.iOS/Renderers/EntryRenderer.cs index 460f66d38ea..069d994aff0 100644 --- a/Xamarin.Forms.Platform.iOS/Renderers/EntryRenderer.cs +++ b/Xamarin.Forms.Platform.iOS/Renderers/EntryRenderer.cs @@ -40,7 +40,6 @@ public abstract class EntryRendererBase : ViewRenderer e) textField.ShouldChangeCharacters += ShouldChangeCharacters; _selectedTextRangeObserver = textField.AddObserver("selectedTextRange", NSKeyValueObservingOptions.New, UpdateCursorFromControl); - _clearButtonSublayerObserver = ClearButton?.Layer.AddObserver(new NSString("sublayers"), NSKeyValueObservingOptions.New, UpdateClearButtonSublayer); + ClearButton?.Layer.AddObserver(this, new NSString("sublayers"), NSKeyValueObservingOptions.New, IntPtr.Zero); } // When we set the control text, it triggers the UpdateCursorFromControl event, which updates CursorPosition and SelectionLength; @@ -160,6 +160,12 @@ protected override void OnElementChanged(ElementChangedEventArgs e) UpdateClearButtonVisibility(); } + public override void ObserveValue(NSString keyPath, NSObject ofObject, NSDictionary change, IntPtr context) + { + if (keyPath == new NSString("sublayers") && _defaultClearImage == null) + UpdateClearButtonVisibility(); + } + protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName == Entry.PlaceholderProperty.PropertyName || e.PropertyName == Entry.PlaceholderColorProperty.PropertyName) @@ -434,15 +440,6 @@ void UpdateCursorFromControl(NSObservedChange obj) } } - void UpdateClearButtonSublayer(NSObservedChange obj) - { - if (Control == null || Element == null) - return; - - if (_defaultClearImage == null) - UpdateClearButtonVisibility(); - } - void UpdateCursorSelection() { if (_nativeSelectionIsUpdating || Control == null || Element == null) From a1f17115df4beec9ad2cda96e9048c1dcde6bd4e Mon Sep 17 00:00:00 2001 From: Gerald Versluis Date: Tue, 9 Nov 2021 16:41:25 +0100 Subject: [PATCH 2/2] Implement fix from Javier (#14790) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Javier Suárez --- Xamarin.Forms.Platform.iOS/Renderers/EntryRenderer.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Xamarin.Forms.Platform.iOS/Renderers/EntryRenderer.cs b/Xamarin.Forms.Platform.iOS/Renderers/EntryRenderer.cs index 069d994aff0..c4295e3c170 100644 --- a/Xamarin.Forms.Platform.iOS/Renderers/EntryRenderer.cs +++ b/Xamarin.Forms.Platform.iOS/Renderers/EntryRenderer.cs @@ -39,6 +39,7 @@ public abstract class EntryRendererBase : ViewRenderer e) _selectedTextRangeObserver = textField.AddObserver("selectedTextRange", NSKeyValueObservingOptions.New, UpdateCursorFromControl); ClearButton?.Layer.AddObserver(this, new NSString("sublayers"), NSKeyValueObservingOptions.New, IntPtr.Zero); + _observedSublayers = true; } // When we set the control text, it triggers the UpdateCursorFromControl event, which updates CursorPosition and SelectionLength;