diff --git a/src/iOS/Avalonia.iOS/AvaloniaView.Text.cs b/src/iOS/Avalonia.iOS/AvaloniaView.Text.cs index 791987eef3..50f5b26728 100644 --- a/src/iOS/Avalonia.iOS/AvaloniaView.Text.cs +++ b/src/iOS/Avalonia.iOS/AvaloniaView.Text.cs @@ -54,12 +54,18 @@ public class AvaloniaResponder : UIResponder, IUITextInput } } - public AvaloniaResponder() + private UIResponder _nextResponder; + + public AvaloniaResponder(AvaloniaView view, ITextInputMethodClient client) { + _nextResponder = view; + _client = client; _tokenizer = new UITextInputStringTokenizer(this); } + public override UIResponder NextResponder => _nextResponder; + public override bool CanPerform(Selector action, NSObject? withSender) { return base.CanPerform(action, withSender); @@ -241,7 +247,8 @@ public class AvaloniaResponder : UIResponder, IUITextInput return new AvaloniaTextRange(range); } - throw new Exception(); + return null; + //throw new Exception(); } UITextPosition IUITextInput.GetPosition(UITextPosition fromPosition, nint offset) diff --git a/src/iOS/Avalonia.iOS/AvaloniaView.cs b/src/iOS/Avalonia.iOS/AvaloniaView.cs index e2fae8db88..0038a03911 100644 --- a/src/iOS/Avalonia.iOS/AvaloniaView.cs +++ b/src/iOS/Avalonia.iOS/AvaloniaView.cs @@ -27,11 +27,9 @@ namespace Avalonia.iOS private TouchHandler _touches; private ITextInputMethodClient _client; private bool _isActive; - private AvaloniaResponder _textResponder; public AvaloniaView() { - _textResponder = new AvaloniaResponder(); _topLevelImpl = new TopLevelImpl(this); _touches = new TouchHandler(this, _topLevelImpl); _topLevel = new EmbeddableControlRoot(_topLevelImpl); @@ -56,8 +54,6 @@ namespace Avalonia.iOS public override bool CanResignFirstResponder => true; - public override UIResponder NextResponder => _textResponder; - internal class TopLevelImpl : ITopLevelImplWithTextInputMethod, ITopLevelImplWithNativeControlHost, ITopLevelImplWithStorageProvider { @@ -164,6 +160,8 @@ namespace Avalonia.iOS bool ITextInputMethodImpl.IsActive => _isActive; + private AvaloniaResponder _currentResponder; + void ITextInputMethodImpl.SetClient(ITextInputMethodClient client) { if (_client != null) @@ -175,21 +173,23 @@ namespace Avalonia.iOS if (_client is { }) { - //_client.CursorRectangleChanged += ClientOnCursorRectangleChanged; - //_client.SurroundingTextChanged += ClientOnSurroundingTextChanged; - _textResponder.BecomeFirstResponder(); + if (_currentResponder != null && _currentResponder.IsFirstResponder) + { + _currentResponder.ResignFirstResponder(); + _currentResponder = null; + } - var x = _textResponder.IsFirstResponder; - - var keyWindow = UIApplication.SharedApplication.KeyWindow; + _currentResponder = new AvaloniaResponder(this, _client); + //_client.CursorRectangleChanged += ClientOnCursorRectangleChanged; - var windowNextResponder = keyWindow.NextResponder; + //_client.SurroundingTextChanged += ClientOnSurroundingTextChanged; + _currentResponder.BecomeFirstResponder(); - var nr1 = windowNextResponder.NextResponder; + var x = _currentResponder.IsFirstResponder; } else { - _textResponder.ResignFirstResponder(); + _currentResponder.ResignFirstResponder(); } } @@ -265,7 +265,7 @@ namespace Avalonia.iOS void ITextInputMethodImpl.Reset() { - _textResponder?.ResignFirstResponder(); + _currentResponder?.ResignFirstResponder(); } } }