检测用户何时临时停止在UITextField Xamarin iOS上键入

时间:2019-05-10 07:23:39

标签: c# visual-studio xamarin

我正在使用Xamarin进行跨平台项目,并且在用户在UITextField上键入内容时遇到时间延迟的问题。

我有一个自定义弹出窗口,该弹出窗口执行搜索产品功能以将所选产品添加到购物车:

用户在文本视图中输入产品代码:

enter image description here

当前,当用户输入产品代码时,每当searchCode = 2时,应用程序都会立即显示指示符,然后开始搜索,并且用户可以在搜索完成后继续输入。

我想优化此逻辑:每当用户停止键入类似1的字符(延迟1的字符)时,应用程序都会进行搜索。

是否有任何事件可以检测用户何时开始和停止输入UITextField?

     public class PopupOrderProductViewModel : BasePopupOrderViewModel
            {
                private string _searchCode;
                public string SearchCode
                {
                    get => _searchCode;
                    set
                    {
                        SetProperty(ref _searchCode, value);

                        if (_shouldSearchCodes)
                        {
                        //hiding keyboard then start searching product by code
                          //I want to change it into: app will start searching whenever user stop typing for 1s
                            if ( value.Trim().Length >= 2)
                            {
                                SearchCodes();
                            }
                            else
                            {
                                ProductCodeItemViewModels = null;
                            }
                        }
                        else
                        {
                            _shouldSearchCodes = true;
                        }

                    }
                }

SearchCode函数中的代码:

private async void SearchCodes()
        {
            MasterViewModel.Instance.ShowIndicator();
            var productCodes = await ProductCodeService.SearchProductCode(SearchCode);
            MasterViewModel.Instance.HideIndicator();
            ShouldShowKeyboard = true;

            ProductCodeItemViewModels = productCodes?.Select(k => new ProductCodeItemViewModel(new OrderedProduct
            {
                ProductCode = k
            }, OnItemClicked)).ToList();
        }

任何建议将不胜感激!

1 个答案:

答案 0 :(得分:0)

您可以使用UITextField.Notifications.ObserveTextFieldTextDidChange来检测UITextField中的文本更改事件。然后,我添加了一个inputCount属性来记录用户的输入计数以控制搜索事件。

SearchCodes函数中,如果您现在传递的搜索次数不等于inputCount,则意味着用户已在1秒钟内输入了文本,并且不会在其中执行代码if语句。

代码如下:

public partial class ViewController : UIViewController
{
    public ViewController(IntPtr handle) : base(handle)
    {
    }

    int inputCount = 0;

    public override void ViewDidLoad()
    {
        base.ViewDidLoad();
        // Perform any additional setup after loading the view, typically from a nib.

        UITextField textF = new UITextField();
        textF.BorderStyle = UITextBorderStyle.Line;
        textF.Frame = new CoreGraphics.CGRect(100, 100, 100, 50);
        View.Add(textF);


        var notification = UITextField.Notifications.ObserveTextFieldTextDidChange((sender, args) => {
            /* Access strongly typed args */
            Console.WriteLine("Notification: {0}", args.Notification);

            inputCount++;

            PerformSelector(new ObjCRuntime.Selector("SearchCodes:"), (NSString)(inputCount.ToString()), 2);

        });

    }

    [Export("SearchCodes:")]
    public void SearchCodes(NSString count)
    {
        if (Convert.ToInt32(count) == this.inputCount)
        {
            Console.WriteLine("start search");

            UIAlertView alertV = new UIAlertView("start search", "",null,"ok");
            alertV.Show();
        }
    }
}