Как отложить поиск при вводе NSSearchField

Я использую AppKit.NSSearchField и мне нужно отложить событие поиска, пока пользователь печатает, например, для фильтрации данных через 2 секунды.

Я добавил действие из построителя интерфейса - "По окончанию редактирования", но оно слишком часто вызывается при наборе . Есть ли собственный способ увеличить время задержки, пока пользователь печатает?

введите здесь описание изображения


person Nininea    schedule 01.12.2016    source источник
comment
Вы можете использовать таймер, который сработает в конце редактирования. И затем, когда он заканчивается, вы запускаете селекторный поиск. Примерно так: пусть задержка =2 // время в секундах NSTimer.scheduledTimerWithTimeInterval(delay, target: self, selector: #selector(search), userInfo: nil, Repeats: false)   -  person Irfan    schedule 01.12.2016
comment
Спасибо за ответ @Irfan Итак, я должен добавить пользовательскую задержку, невозможно увеличить время задержки для этого элемента управления?   -  person Nininea    schedule 01.12.2016
comment
Я вполне уверен, что это так - как следует из названия в конце редактирования. Иначе это называлось бы что-то вроде редактирования в конце с задержкой :)   -  person Irfan    schedule 01.12.2016
comment
Для чего нужен тег С#? Как вы получаете уведомление об изменении текста? Не используйте NSTimer. Используйте dispatch_after.   -  person El Tomato    schedule 02.12.2016


Ответы (1)


Вы должны использовать технику, называемую устранением дребезга. Идея состоит в том, чтобы выполнить метод изнутри вашего действия (которое вы подключили к «конечному редактированию») после некоторой задержки. Каждое новое нажатие клавиши сбрасывает таймер с фиксированной задержкой. Пока пользователь не продолжит печатать, поиск не будет выполняться. Как только он остановится, сработает последний таймер дебаунса, и ваш поиск продолжится.

Дополнительная информация здесь: Как отменить вызов метода?

person Eugene Mankovski    schedule 02.12.2016
comment
этот.таймер?.Неверный (); this.timerDetails = NSTimer.CreateScheduledTimer(NSConstants.SearchDelaSec, (obj) => { FilterData(); }); вот мое решение, но у него есть проблемы. не работает, как ожидалось - person Nininea; 04.12.2016
comment
@Nininea Ваш код, когда он немного исправлен, работает нормально. Я создал пример с задержкой в ​​1 секунду: github.com/emankovski/DebouncedSearch - person Eugene Mankovski; 05.12.2016