Как обнаружить паузу во вводе для UISearchBar / UITextField?

У меня есть следующий код UISearchbar:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText { [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; NSString* endpoint =[NSString stringWithFormat:@"http://www.someurl/", [searchText stringByReplacingOccurrencesOfString:@" " withString:@"+"]]; NSURL* url = [NSURL URLWithString:endpoint]; NSURLRequest* request = [NSURLRequest requestWithURL:url]; GTMHTTPFetcher* myFetcher = [GTMHTTPFetcher fetcherWithRequest:request]; [myFetcher beginFetchWithDelegate:self didFinishSelector:@selector(searchResultsFetcher:finishedWithData:error:)]; } 

Я хочу отправить этот запрос после паузы во входе и сбросить таймер каждый раз, когда персонаж попал. Как я могу это сделать?

Он не должен использовать NSTimer.

 - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText { [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(request) object:nil]; //..... [self performSelector:@selector(request) withObject:nil afterDelay:yourpausetime]; } 

В методе textDidChange создайте NSTimer, скажем, 2 секунды. Если таймер уже существует, аннулировать и воссоздать таймер. (Неподтвержденный код 🙂

 - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText { if (myTimer) { if ([myTimer isValid]) { [myTimer invalidate]; } [myTimer release], myTimer = nil; } myTimer = [[NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(userPaused:) userInfo:nil repeats:NO] retain]; } 

Когда пользователь перестанет печатать в течение 2 секунд, будет вызван -userPaused: и ваш таймер будет автоматически аннулирован (хотя и не равен нулю). Когда пользователь снова начнет вводить текст, будет настроен новый таймер.

Я смог адаптировать Sven Tan к моему существующему коду в Swift. В моем случае я отправляю строку методу, который загружает результаты поиска async. Кроме того, я не использую UISearchBar, а скорее простой UITextField.

 var currentTempQuery = "" ... func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { if let t = textField.text { let s: NSString = t let newString = s.stringByReplacingCharactersInRange(range, withString: string).trim() NSObject.cancelPreviousPerformRequestsWithTarget(self, selector:#selector(MyViewController.sendSearchRequest(_:)), object: currentTermQuery) // Don't replace currentTermQuery until after the cancelPreviousPerformRequestWithTarget call currentTermQuery = newString performSelector(#selector(MyViewController.sendSearchRequest(_:)), withObject: newString, afterDelay: 1) } return true } 

Вот селектор, который вызывается:

 func sendSearchRequest(text: String?) { // Call async search method here... } 

Способ, которым cancelPreviousPerformRequestsWithTarget работает, – это передача одного и того же целевого объекта, селектора и объекта, который был передан в вызове performSelector чтобы предыдущий запрос был отменен. В моей реализации, поскольку я передаю только строку, мне нужно сохранить текущую строку запроса между вызовами, чтобы я мог ссылаться на нее для отмены запросов.

Результат работает для ввода и удаления символов в UITextField. Только один поиск отправляется на каждое изменение поискового запроса.

Как я уже сказал, похоже на то, что написал Свен Тан, но немного другое использование. Надеюсь, это поможет некоторым людям.

Отличный код и идеальная работа для меня. Я нашел его здесь. Замена NSTimer на performSelector: withObject: afterDelay . Благодаря решению Бена … все щедрости ему, я просто скопирую его здесь, чтобы его легко найти

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { //because the view can be unloaded we must store all data so that its state can be restored in viewDidLoad self.searchQuery = [textField.text stringByReplacingCharactersInRange:range withString:string]; SEL fetchSearchResults = @selector(fetchSearchResults); //cancel the previous search request [[self class] cancelPreviousPerformRequestsWithTarget:self selector:fetchSearchResults object:nil]; //perform the search in a seconds time. If the user enters addition data then this search will be cancelled by the previous line [self performSelector:fetchSearchResults withObject:nil afterDelay:1]; return YES; } - (void)fetchSearchResults { NSLog(@"performing search %@", self.searchQuery); ... } 

Вставьте текстовый ввод в свой поиск и попросите NSTimer вызвать селектор. Покажите какой-то индикатор, чтобы пользователь не думал, что что-то идет не так. Когда срабатывает селектор, вы можете вернуться к пользователю, чтобы продолжить ввод текста

 [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(targetMethod:) userInfo:nil repeats:NO]; 
  • Что именно делает делегат в проекте xcode ios?
  • Лучший способ заставить NSRunLoop ждать установки флага?
  • Сортировка NSArray пользовательских объектов по их свойствам NSDate
  • Загрузка изображений из фоновой темы с использованием блоков
  • Ошибка AdMob с помощью : непризнанный селектор
  • Остановить UIWebView от «подпрыгивания» по вертикали?
  • Как сделать ImageView UITableViewCell фиксированным, даже когда изображение меньше
  • Как использовать метод prepareForReuse
  • Как я могу получить точное время, например, в миллисекундах в Objective-C?
  • Программно включить Bluetooth в iphone sdk?
  • UITextView внутри UIScrollView с AutoLayout
  • Interesting Posts

    Java: как обращаться к методам из другого classа

    Не удалось подключиться к серверу ASP.Net Development Server

    Где опция Text Transform для изгибающего текста в Microsoft Word?

    JFreechart рисовать дугу на графике

    Любая хорошая утилита для отслеживания исходящего трафика и запросов от Win PC?

    Есть ли какие-либо плюсы и минусы, если я всегда использую CSS-class вместо CSS ID для всего?

    Как отправлять и получать сообщения WebSocket на стороне сервера?

    Скопируйте все содержимое каталога в C #

    Настройка Windows 7 alt-tab Опыт

    Объединение данных между путями на основе идентификатора с помощью AngularFire

    Необходимо обрабатывать неперехваченное исключение и отправлять файл журнала

    Отключение выбора текста в PhoneGap

    Const до или const после?

    Полноэкранное фоновое изображение в действии

    Как сделать снимок экрана в Windows 7 и автоматически создать файл скриншотов на рабочем столе, таком как Mac?

    Давайте будем гением компьютера.