diff --git a/src/Uno.UI/UI/Xaml/Controls/TextBox/SinglelineTextBoxDelegate.iOS.cs b/src/Uno.UI/UI/Xaml/Controls/TextBox/SinglelineTextBoxDelegate.iOS.cs index 1a39cacf5b5f..7ea061a1aa7f 100644 --- a/src/Uno.UI/UI/Xaml/Controls/TextBox/SinglelineTextBoxDelegate.iOS.cs +++ b/src/Uno.UI/UI/Xaml/Controls/TextBox/SinglelineTextBoxDelegate.iOS.cs @@ -29,7 +29,7 @@ public override bool ShouldChangeCharacters(UITextField textField, NSRange range { if (textField is SinglelineTextBoxView textBoxView) { - if (_textBox.GetTarget() is not TextBox textBox) + if (_textBox.GetTarget() is not { } textBox) { return false; } @@ -50,7 +50,7 @@ public override bool ShouldChangeCharacters(UITextField textField, NSRange range // When replacing text from pasting (multiple characters at once) // we should only allow it (return true) when the new text length // is lower or equal to the allowed length (TextBox.MaxLength) - var newLength = textBoxView.Text.Length + replacementString.Length - range.Length; + var newLength = textBoxView.Text?.Length + replacementString.Length - range.Length; return newLength <= textBox.MaxLength; }; } diff --git a/src/Uno.UI/UI/Xaml/Controls/TextBox/SinglelineTextBoxView.iOS.cs b/src/Uno.UI/UI/Xaml/Controls/TextBox/SinglelineTextBoxView.iOS.cs index 91a18eaf8e88..b65168b121f0 100644 --- a/src/Uno.UI/UI/Xaml/Controls/TextBox/SinglelineTextBoxView.iOS.cs +++ b/src/Uno.UI/UI/Xaml/Controls/TextBox/SinglelineTextBoxView.iOS.cs @@ -1,4 +1,5 @@ -using System; +#nullable enable +using System; using System.Runtime.InteropServices; using CoreGraphics; using Foundation; @@ -19,10 +20,10 @@ namespace Microsoft.UI.Xaml.Controls { public partial class SinglelineTextBoxView : UITextField, ITextBoxView, DependencyObject, IFontScalable { - private SinglelineTextBoxDelegate _delegate; + private SinglelineTextBoxDelegate _delegate = null!; private readonly WeakReference _textBox; - private Action _foregroundChanged; - private IDisposable _foregroundBrushChangedSubscription; + private Action? _foregroundChanged; + private IDisposable? _foregroundBrushChangedSubscription; public SinglelineTextBoxView(TextBox textBox) { @@ -32,13 +33,13 @@ public SinglelineTextBoxView(TextBox textBox) Initialize(); } - public override void Paste(NSObject sender) => HandlePaste(() => base.Paste(sender)); + public override void Paste(NSObject? sender) => HandlePaste(() => base.Paste(sender)); - public override void PasteAndGo(NSObject sender) => HandlePaste(() => base.PasteAndGo(sender)); + public override void PasteAndGo(NSObject? sender) => HandlePaste(() => base.PasteAndGo(sender)); - public override void PasteAndMatchStyle(NSObject sender) => HandlePaste(() => base.PasteAndMatchStyle(sender)); + public override void PasteAndMatchStyle(NSObject? sender) => HandlePaste(() => base.PasteAndMatchStyle(sender)); - public override void PasteAndSearch(NSObject sender) => HandlePaste(() => base.PasteAndSearch(sender)); + public override void PasteAndSearch(NSObject? sender) => HandlePaste(() => base.PasteAndSearch(sender)); public override void Paste(NSItemProvider[] itemProviders) => HandlePaste(() => base.Paste(itemProviders)); @@ -54,7 +55,7 @@ private void HandlePaste(Action baseAction) internal TextBox TextBox => _textBox.GetTarget(); - public override string Text + public override string? Text { get => base.Text; set @@ -69,15 +70,14 @@ public override string Text } } - private void OnEditingChanged(object sender, EventArgs e) + private void OnEditingChanged(object? sender, EventArgs e) { OnTextChanged(); } private void OnTextChanged() { - var textBox = _textBox?.GetTarget(); - if (textBox != null) + if (TextBox is { } textBox) { var text = textBox.ProcessTextInput(Text); SetTextNative(text); @@ -99,14 +99,12 @@ private void Initialize() partial void OnLoadedPartial() { - this.EditingChanged += OnEditingChanged; - this.EditingDidEnd += OnEditingChanged; + SubscribeEditingEvents(); } partial void OnUnloadedPartial() { - this.EditingChanged -= OnEditingChanged; - this.EditingDidEnd -= OnEditingChanged; + UnsubscribeEditingEvents(); } //Forces the secure UITextField to maintain its current value upon regaining focus @@ -114,14 +112,27 @@ public override bool BecomeFirstResponder() { var result = base.BecomeFirstResponder(); - if (SecureTextEntry) + if (SecureTextEntry && !string.IsNullOrEmpty(Text)) { + UnsubscribeEditingEvents(); + var text = Text; - Text = string.Empty; + UpdatePasswordText(string.Empty); InsertText(text); + UpdatePasswordText(text); + + SubscribeEditingEvents(); } return result; + + void UpdatePasswordText(string text) + { + if (TextBox is PasswordBox passwordBox) + { + passwordBox.Password = text; + } + } } public override CGSize SizeThatFits(CGSize size) @@ -261,5 +272,17 @@ public void Select(int start, int length) } } } + + private void SubscribeEditingEvents() + { + EditingChanged += OnEditingChanged; + EditingDidEnd += OnEditingChanged; + } + + private void UnsubscribeEditingEvents() + { + EditingChanged -= OnEditingChanged; + EditingDidEnd -= OnEditingChanged; + } } }