2013-08-16 9 views
5

Miej nadzieję, że ktoś może rzucić trochę światła na to.Wykonaj akcję po lekkim opóźnieniu, gdy wpisujesz UITextField

Pracuję nad aplikacją dla firmy i mają pole wyszukiwania, które jest niestandardowym UITextField. Obecnie udoskonala wyszukiwanie przy każdej wprowadzonej literze.

Problem: Mają małe okienko wskazujące, że wyszukuje i po każdym naciśnięciu klawisza miga on i znika z ekranu. Oczywiście nie chcą tego.

To, co myślałem o zrobieniu, chociaż nie jestem pewien jak, to zamiast udoskonalać wyszukiwanie na każdym naciśnięciu klawisza, przeszukując je po zakończeniu pisania. ALE, nie chcę też dodawać przycisku "Szukaj". Chcę tylko, żeby skończyli pisać, jedną sekundę, opóźnienie lub coś, dzieje się wyszukiwanie.

Czy istnieje sposób na wykrycie, kiedy użytkownik zakończy pisanie? Czy ktoś to zrobił?

Z góry dziękuję.

+0

Możliwy duplikat [? Jak wykryć przerwę w wejście dla UISearchBar/UITextField] (http://stackoverflow.com/questions/7061377/how-to-detect -a-pauza-in-input-for-uisearchbar-uitextfield) – Cristik

Odpowiedz

7

Prawdopodobnie można to zrobić za pomocą prostego NSTimer. W polu shouldChangeCharactersInRange: sprawdź, czy licznik czasu jest prawidłowy, a jeśli tak, unieważ go, a następnie uruchom ponownie zegar. Kiedy czas jest wreszcie głośno na ogień, oznacza to, że użytkownik nie wpisał nic w określonym przedziale czasowym.

- (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; 
} 

Jak @Jai Govindani wskazał w celu wdrożenia tej metody, musisz przypisać kontroler jako delegat swojego UITextField i upewnij się, że sterownik jest zgodny z protokołem UITextFieldDelegate.

+0

nie zapomnij najpierw ustawić się jako delegat UITextField, oczywiście –

+0

To ma sens i jest to świetny początek, ale mam awarię. Prawdopodobnie z powodu problemu z inicjalizacją? Wpisuję pierwszą literę w polu, nic się nie dzieje (nawet po opóźnieniu). Wpisz drugą literę w polu, awaria! Błąd EXC_BAD_ACCESS. Czuję, że jestem blisko. – r0ddy

+0

@ r0ddy Trudno powiedzieć, na czym polega problem, ale gdy wszystko zostanie poprawnie ustawione, podejście to powinno działać tak, jak chcesz. –

0

Można spróbować następujący sposób

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

w UITextField metody delegata

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

Po prostu opóźniłoby to każdą aktualizację, a nie opóźnienie wszystkiego, dopóki użytkownik nie zakończy pisania. –

+0

@ 0x7fffffff Ok. Mam to mój błąd. Wywołuje selektor wiele razy. Zgodziłem się, że to zła odpowiedź. – Exploring

5

metodą na timerWithTimeInterval: docelowa: selektor: userinfo: powtarza: należy dodać licznik do runloop. Musiałem zmieniać odpowiedź następująco:

- (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; 
} 
Powiązane problemy