Определите, когда пользователь временно прекратит печатать на iOS UITextField Xamarin - PullRequest
0 голосов
/ 10 мая 2019

Я работаю над кроссплатформенным проектом, использующим 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 голосов
/ 13 мая 2019

Вы можете использовать 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();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...