2013-08-16 3 views
5

누군가가이 문제에 대해 밝힐 수 있기를 바랍니다.UITextField를 입력 할 때 약간의 지연 후 조치 수행

나는 회사의 앱을 만들고 있는데 사용자 정의 UITextField 인 검색 필드가 있습니다. 현재는 입력 한 각 문자로 검색을 구체화합니다.

문제 : 검색 중임을 나타내는 작은 팝업이 표시되며 각 키 누르기로 화면에 플래시가 켜지고 꺼지는 것을 확인할 수 있습니다. 그들은 분명히 이것을 원하지 않습니다.

내가 어떻게 생각하고 있었는지는 확실하지 않지만 모든 키 누르기에 대한 검색을 수정하고 입력이 끝나면 검색하는 것이 좋습니다. 하지만 "검색"버튼을 추가하지 않아도됩니다. 나는 단지 그들이 타이핑, 1 초, 지연 또는 어떤 것을 끝내기를 원한다.

사용자가 타이핑을 완료하면 감지하는 방법이 있습니까? 아무도이 짓을 한거야?

미리 감사드립니다.

+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

당신은 방법 timerWithTimeInterval으로 UITextField 대리자 메서드

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

이렇게하면 사용자가 입력을 마칠 때까지 모든 것을 지연하는 대신 모든 업데이트가 지연됩니다. –

+0

@ 0x7fffffff 확인. 그건 내 실수 야. 선택기를 여러 번 호출합니다. 나는 그것이 틀린 대답이라고 동의했다. – Exploring

5

에 다음과 같은 방법

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

을 시도 할 수 있습니다 : 대상 : 선택기 : 사용자 정보를 : 반복 : 당신은 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; 
} 
관련 문제