2013-08-16 3 views
5

Надеясь, что кто-то может пролить свет на это.Выполните действие после небольшой задержки при вводе в UITextField

Я работаю над приложением для компании, и у них есть поле поиска, которое является пользовательским UITextField. В настоящее время он уточняет поиск с каждой введенной буквой.

Проблема: у них есть небольшое всплывающее окно, указывающее, что это поиск и с каждым нажатием клавиши вы видите, что он мигает и выключается. Очевидно, они этого не хотят.

Что я думал делать, хотя не знаю, как это сделать, вместо того чтобы уточнять поиск на каждом нажатии клавиши, ища, когда они закончат ввод. НО, я также не хочу добавлять кнопку «Поиск». Я просто хочу, чтобы они закончили печатать, одна секунда, задержка или что-то, поиск происходит.

Есть ли способ определить, когда пользователь закончил печатать? Кто-нибудь это сделал?

Заранее спасибо.

+0

Возможный дубликат [Как обнаружить паузу в вход для UISearchBar/UITextField] (http://stackoverflow.com/questions/7061377/how-to-detect -a-pause-in-input-for-uisearchbar-uitextfield) – Cristik

ответ

7

Возможно, вы можете сделать это с помощью простого NSTimer. В shouldChangeCharactersInRange: проверьте, действительно ли таймер, и если да, недействительным, а затем перезапустите таймер. Когда время, наконец, вслух загорается, это означает, что пользователь не набрал ничего в указанном вами интервале за время.

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 
    if (someTimer.isValid) { 
     [someTimer invalidate]; 
    } 
    someTimer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(timeToSearchForStuff:) userInfo:nil repeats:NO]; 

    return YES; 
} 

Как @Jai Govindani отметил, для реализации этого метода, вам необходимо назначить контроллер в качестве делегата от вашего UITextField и убедитесь, что ваш контроллер соответствует протоколу UITextFieldDelegate.

+0

не забудьте указать себя как делегат UITextField, конечно, –

+0

Это имеет смысл, и это отличное начало, но я получаю сбой. Возможно, из-за проблемы с инициализацией? Я печатаю первую букву в поле, ничего не происходит (даже после задержки). Введите вторую букву в поле, сбой! Ошибка EXC_BAD_ACCESS. Я чувствую, что я рядом. – r0ddy

+0

@ r0ddy Трудно сказать, в чем проблема, но как только вы получите все правильно выстроенное, этот подход должен работать так, как вы этого хотите. –

0

Вы можете попробовать следующий способ

[self performSelector:<your selector> withObject:<object if you want to pass anything> afterDelay:<time delay>]; 

в UITextField метод делегата

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
+0

Это просто задержит каждое обновление, а не задерживает все, пока пользователь не закончит печатать. –

+0

@ 0x7fffffff Хорошо. Получил это моя ошибка. Он будет вызывать селектор несколько раз. Я согласился, что это неправильный ответ. – Exploring

5

С методом timerWithTimeInterval: цели: селектор: USERINFO: повторы: Вы должны добавить таймер к runloop. Мне нужно изменить ответ следующим образом:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{ 
    if (someTimer.isValid) { 
     [someTimer invalidate]; 
    } 
    someTimer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(timeToSearchForStuff:) userInfo:nil repeats:NO]; 
    [[NSRunLoop mainRunLoop] addTimer:someTimer forMode:NSDefaultRunLoopMode]; 
    return YES; 
} 
Смежные вопросы