Xamarin.IOS中的UITextField KeyPress处理程序

时间:2017-10-17 04:43:58

标签: c# android xamarin xamarin.ios xamarin.android

在我的xamarin.android项目中,我有一个使用了edittext的屏幕,其类型为numberdecimal。我在keyPress上获取了textchanged事件并附加了 使用下面的方法向左编号。 这是代码。

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;
        }
}

我的问题是..我想在Xamarin.ios中复制整件事。我对这个xamarin.ios很新。任何人都可以指导我 实现这个目标。请让我知道有没有其他的解决方法来做这个。

这是xamarin.ios代码(不完整)

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 个答案:

答案 0 :(得分:0)

你很容易实现这一点,尽管它在iOS中的包装方式不同。使用代理处理它,而不是使用EventHandlers

在控制器中将TextField的委托设置为this

field.Delegate = this;

确保您的控制器实现IUITextFieldDelegate

然后实现以下方法:

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

每次文本更改时都会调用它,您也可以从函数中获取值。