Browse Source

fix responder issue.

pull/8963/head
Dan Walmsley 4 years ago
parent
commit
9a4cd3d8c9
  1. 11
      src/iOS/Avalonia.iOS/AvaloniaView.Text.cs
  2. 28
      src/iOS/Avalonia.iOS/AvaloniaView.cs

11
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); _tokenizer = new UITextInputStringTokenizer(this);
} }
public override UIResponder NextResponder => _nextResponder;
public override bool CanPerform(Selector action, NSObject? withSender) public override bool CanPerform(Selector action, NSObject? withSender)
{ {
return base.CanPerform(action, withSender); return base.CanPerform(action, withSender);
@ -241,7 +247,8 @@ public class AvaloniaResponder : UIResponder, IUITextInput
return new AvaloniaTextRange(range); return new AvaloniaTextRange(range);
} }
throw new Exception(); return null;
//throw new Exception();
} }
UITextPosition IUITextInput.GetPosition(UITextPosition fromPosition, nint offset) UITextPosition IUITextInput.GetPosition(UITextPosition fromPosition, nint offset)

28
src/iOS/Avalonia.iOS/AvaloniaView.cs

@ -27,11 +27,9 @@ namespace Avalonia.iOS
private TouchHandler _touches; private TouchHandler _touches;
private ITextInputMethodClient _client; private ITextInputMethodClient _client;
private bool _isActive; private bool _isActive;
private AvaloniaResponder _textResponder;
public AvaloniaView() public AvaloniaView()
{ {
_textResponder = new AvaloniaResponder();
_topLevelImpl = new TopLevelImpl(this); _topLevelImpl = new TopLevelImpl(this);
_touches = new TouchHandler(this, _topLevelImpl); _touches = new TouchHandler(this, _topLevelImpl);
_topLevel = new EmbeddableControlRoot(_topLevelImpl); _topLevel = new EmbeddableControlRoot(_topLevelImpl);
@ -56,8 +54,6 @@ namespace Avalonia.iOS
public override bool CanResignFirstResponder => true; public override bool CanResignFirstResponder => true;
public override UIResponder NextResponder => _textResponder;
internal class TopLevelImpl : ITopLevelImplWithTextInputMethod, ITopLevelImplWithNativeControlHost, internal class TopLevelImpl : ITopLevelImplWithTextInputMethod, ITopLevelImplWithNativeControlHost,
ITopLevelImplWithStorageProvider ITopLevelImplWithStorageProvider
{ {
@ -164,6 +160,8 @@ namespace Avalonia.iOS
bool ITextInputMethodImpl.IsActive => _isActive; bool ITextInputMethodImpl.IsActive => _isActive;
private AvaloniaResponder _currentResponder;
void ITextInputMethodImpl.SetClient(ITextInputMethodClient client) void ITextInputMethodImpl.SetClient(ITextInputMethodClient client)
{ {
if (_client != null) if (_client != null)
@ -175,21 +173,23 @@ namespace Avalonia.iOS
if (_client is { }) if (_client is { })
{ {
//_client.CursorRectangleChanged += ClientOnCursorRectangleChanged; if (_currentResponder != null && _currentResponder.IsFirstResponder)
//_client.SurroundingTextChanged += ClientOnSurroundingTextChanged; {
_textResponder.BecomeFirstResponder(); _currentResponder.ResignFirstResponder();
_currentResponder = null;
}
var x = _textResponder.IsFirstResponder; _currentResponder = new AvaloniaResponder(this, _client);
//_client.CursorRectangleChanged += ClientOnCursorRectangleChanged;
var keyWindow = UIApplication.SharedApplication.KeyWindow;
var windowNextResponder = keyWindow.NextResponder; //_client.SurroundingTextChanged += ClientOnSurroundingTextChanged;
_currentResponder.BecomeFirstResponder();
var nr1 = windowNextResponder.NextResponder; var x = _currentResponder.IsFirstResponder;
} }
else else
{ {
_textResponder.ResignFirstResponder(); _currentResponder.ResignFirstResponder();
} }
} }
@ -265,7 +265,7 @@ namespace Avalonia.iOS
void ITextInputMethodImpl.Reset() void ITextInputMethodImpl.Reset()
{ {
_textResponder?.ResignFirstResponder(); _currentResponder?.ResignFirstResponder();
} }
} }
} }

Loading…
Cancel
Save