UITextField KeyPress Handler in Xamarin.IOS

2019-08-24 03:07发布

问题:

In my xamarin.android project i am having a screen in which edittext have been used, which is of type numberdecimal. here i am getting the textchanged event on keyPress and appending the number to the left using the method like below. Here is the code.

namespace MobileApplication.Droid
{
    [Activity(Label = "TransferScreen2Activity", ScreenOrientation = ScreenOrientation.Portrait, Theme = "@style/MyTheme")]
    public class TransferScreenActivity : BaseActivity, IOnTouchListener
    {
    Button _nextButton;      
    EditText _amountEditText;
    bool _triggerTextChangedforAmountEntry = true;
    protected override async void OnCreate(Bundle savedInstanceState)
        {

            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.transferscreen2);
        _nextButton = FindViewById<Button>(Resource.Id.btnNext);

            _amountEditText = FindViewById<EditText>(Resource.Id.etTransactionAmount);
            _amountEditText.SetSelection(_amountEditText.Text.Length);

            _amountEditText.TextChanged += _amountEditText_TextChanged;

            _amountEditText.SetOnTouchListener(this);
    }

    private void _amountEditText_TextChanged(object sender, Android.Text.TextChangedEventArgs e)
        {
            if (_triggerTextChangedforAmountEntry)
            {
                _triggerTextChangedforAmountEntry = false;
                string pressedKey = "";
                if (e.Text.Count() < (e.Start + 1))
                {
                    pressedKey = "";
                }
                else
                {
                    pressedKey = e.Text.ToString()[e.Start].ToString();
                }


                if (!string.IsNullOrEmpty(pressedKey))
                {
                    CalculateAmountAfterKeyPress(pressedKey, e.Start);

                }
                else
                {
                    CalculateAmountAfterKeyPress("←", 0);
                }

                _amountEditText.SetSelection(_amountEditText.Text.Length);
                _triggerTextChangedforAmountEntry = true;
            }
        }

    private void CalculateAmountAfterKeyPress(string key, int cursorPosition) //appending method.
        {
            string currentText = "";
            if (key == "←")
            {
                currentText = _amountEditText.Text.Trim().Replace("$", "");
            }
            else
            {
                currentText = _amountEditText.Text.Trim().Remove(cursorPosition, 1).Replace("$", "");
            }

            string result = "0";
            bool isProperValue = false;
            switch (key)
            {
                case "0":
                case "1":
                case "2":
                case "3":
                case "4":
                case "5":
                case "6":
                case "7":
                case "8":
                case "9":
                    isProperValue = Common.ShiftLeftandAppendChar(currentText, key, out result);

                    break;
                case "←":
                    isProperValue = Common.ShiftRight(currentText, out result);
                    break;
                case "C":
                    isProperValue = true;
                    result = "0.00";
                    break;
                default:
                    isProperValue = true;
                    break;
            }

            _amountEditText.Text = Resources.GetString(Resource.String.CurrencySymbol) + result;
            if (!isProperValue)
            {
                Common.ShakeAnimation(this, _amountEditText);
            }
        }

    public bool OnTouch(View v, MotionEvent e)
        {
            _amountEditText.OnTouchEvent(e);
            _amountEditText.SetSelection(_amountEditText.Text.Length);
            return true;
        }
}

My question is ..I want to replicate the whole thing in Xamarin.ios..and i am very new to this xamarin.ios. Can anyone please guide me to achieve this one.Please let me know is there any other workaround to do this one.

Here is xamarin.ios code(incomplete)

namespace MobileApplication.iOS
{
    public partial class FundTransferScreenController : BaseViewController
        {
        public FundTransferScreenController(IntPtr handle) : base(handle)
            {
             }

            public override async void ViewDidLoad()
            {
                    base.ViewDidLoad();
            amountValue.ValueChanged += HandleTextChanged; 

                }

        }

        private void HandleTextChanged(object sender, EventArgs e)
        {
            //how to do it like android code..?
        }
    public override void TouchesBegan(NSSet touches, UIEvent evt)
        {
            base.TouchesBegan(touches, evt);
            amountValue.ResignFirstResponder();
        }
}

回答1:

You can quite easily achieve that, albeit it's been wrapped differently in iOS. Handle it with delegates, not EventHandlers

Set your TextField's delegate to this, in your controller:

field.Delegate = this;

Make sure your controller implements IUITextFieldDelegate

Then implement the following the method:

    [Export("textField:shouldChangeCharactersInRange:replacementString:")]
    public bool ShouldChangeCharacters(UITextField textField, NSRange range, string replacementString)
    {
        return true;
    }

That's called every time text changes, and you can also get the value from the function.