2012-11-21 2 views
0

다음에 함수 호출 그래서 사용자가 UITextField에서 키의 반환을 누를 때마다 키보드가 숨겨지고 그 다음에 함수가 호출됩니다. 지금 당장 가지고 있습니다 :Return 키 [UITextField]에서 키보드를 숨기고

-(BOOL)textFieldShouldReturn:(UITextField *)textField 
{ 
    if(textField == _currentPasswordField) 
    { 
     [textField resignFirstResponder]; 
     [_passwordField becomeFirstResponder]; 
     return YES; 
    } 
    else if (textField == _passwordField) 
    { 
     [textField resignFirstResponder]; 
     [_confirmPasswordField becomeFirstResponder]; 
     return YES; 
    } 
    else 
    { 
     [textField resignFirstResponder]; 
     [self changePassword]; 
     return YES; 
    } 
} 

그러나 전체 changePassword 함수가 반환 된 후에 키보드가 숨겨집니다. 어떻게 숨길 수 있습니까? 그런 다음 함수를 호출합니까?!

감사합니다.

+0

'changePassword'는 무엇을하나요? 달리기에 시간이 오래 걸리나요? 사용자 인터페이스를 제공합니까? –

+0

UI를 표시하지 않습니다 ... 그냥 내 서버를 호출하고 주어진 user_id에 대한 암호를 변경하려고합니다. – abisson

답변

0

문제는 네트워크를 통해 서버와 통신 되었기 때문에 changePassword 방법은 실행하는 데 시간이 오래 걸리는 것입니다.

키보드 숨기기 애니메이션과 같은 모든 사용자 인터페이스 업데이트가 주 스레드에서 트리거됩니다. 주 스레드에서 느린 메서드를 호출하면 해당 사용자 인터페이스 업데이트가 실행되지 않습니다.

메인 스레드에서 changePassword으로 전화를 이동해야합니다. 이를 수행 할 수있는 많은 방법이 있습니다.

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    [self changePassword]; 
}); 

그러나, 이것은 안전하지 않습니다 당신의 changePassword 방법은 스레드 안전하지 않는 한, 당신이있어 무엇을 생각해야하므로 : 가장 간단한 방법 중 하나는 다음과 같이 그랜드 센트럴 디스패치 (GCD)를 사용하는 것입니다 changePassword에서 수행하고 다른 스레드가 주 스레드에서 실행되는 동안 그 스레드는 백그라운드 스레드에서 실행됩니다.

WWDC 2010에서 세션 211 - 그랜드 센트럴 디스패치로 아이폰 앱 개발 단순화와 같은 일부 WWDC 비디오를 읽어야합니다.

+0

완벽한 감사합니다! – abisson

관련 문제